This guide provides information on how to work with events, set up your system to see events, and how to use events in the tool.
These guides will serve as video guides to getting the prerequisites setup. Please reference the text guide below for details.
- Events Guide
Warning
This document is techincal and is not intended to be user friendly. This is not intended for normal users.
Each game has its own set of events that can modify stats. An event from Forza Horizon 3, activated when you purchase a car, as an example. The event is called Microsoft.XboxLive.T1289871275.CarAddedToGarage
. The T1289871275
part is the letter T followed by the game's TitleID. Most data outside of the Data section is not required to be valid, as you can see from the Anonymising Events section. Events require additional authentication, which is explained in the "Sending Events" section.
Events contain lots of identifying information you should remove before sharing them on the github repo. I will provide an example of an event straight from wireshark and one prepared to be put into the events database github repository
{
"ver": "4.0",
"name": "Microsoft.XboxLive.T1289871275.CarAddedToGarage",
"time": "2024-04-07T01:11:53.6748551Z",
"iKey": "o:0890af88a9ed4cc886a14f5e174a2827",
"ext": {
"utc": {
"shellId": 281572416699236352,
"eventFlags": 514,
"pgName": "XBOX",
"flags": 880804513,
"epoch": "903317",
"seq": 807
},
"privacy": {
"isRequired": false
},
"metadata": {
"f": {
"baseData": {
"f": {
"properties": {
"f": {
"BuildNum": 4,
"CarId": 4,
"IsHorizonEdition": 4,
"NumCarsInGarage": 4,
"Track": 4
}
}
}
}
},
"policies": 0
},
"os": {
"bootId": 284,
"name": "Windows",
"ver": "10.0.22621.3296.amd64fre.ni_release.220506-1250",
"expId": "RS:1B54D,MD:283BAEF,ME:28279A6,MD:2A69053,MD:255521A"
},
"app": {
"id": "U:Microsoft.OpusPG_1.0.125.2_x64__8wekyb3d8bbwe!OpusReleaseFinal",
"ver": "1.0.125.2_x64_!2018/06/05:22:52:33!60EF05C!forza_x64_release_final.exe",
"is1P": 1,
"asId": 898
},
"device": {
"localId": "s:0039DA16-8F86-463F-9EBE-CB0619831735",
"deviceClass": "Windows.Desktop"
},
"protocol": {
"devMake": "Micro-Star International Co., Ltd.",
"devModel": "MS-7E06",
"ticketKeys": ["21171495"]
},
"user": {
"localId": "w:EFEB6F6A-3B57-C3DA-5A6B-B5908C25B28C"
},
"loc": {
"tz": "+01:00"
}
},
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "CarAddedToGarage",
"serviceConfigId": "19020100-9575-4c2b-9916-3d664ce1dfab",
"playerSessionId": "DBF9D623-02F2-4CAB-866E-EDF6908C9491",
"titleId": "1289871275",
"userId": "1234567890123456",
"ver": 1,
"properties": {
"BuildNum": 156858,
"CarId": 302,
"IsHorizonEdition": 0,
"NumCarsInGarage": 20,
"Track": 552
}
}
}
}
{
"ver": "4.0",
"name": "Microsoft.XboxLive.T1289871275.CarAddedToGarage",
"time": "REPLACETIME",
"iKey": "o:0890af88a9ed4cc886a14f5e174a2827",
"ext": {
"utc": {
"shellId": 1,
"eventFlags": 1,
"pgName": "XBOX",
"flags": 1,
"epoch": "1",
"seq": REPLACESEQ
},
"privacy": {
"isRequired": false
},
"metadata": {
"f": {
"baseData": {
"f": {
"properties": {
"f": {
"BuildNum": 1,
"CarId": 1,
"IsHorizonEdition": 1,
"NumCarsInGarage": 1,
"Track": 1
}
}
}
}
},
"policies": 0
},
"os": {
"bootId": 1,
"name": "1",
"ver": "1",
"expId": "1"
},
"app": {
"id": "U:Microsoft.OpusPG_1.0.125.2_x64__8wekyb3d8bbwe!OpusReleaseFinal",
"ver": "1.0.125.2_x64_!2018/06/05:22:52:33!60EF05C!forza_x64_release_final.exe",
"is1P": 1,
"asId": 1
},
"device": {
"localId": "s:11111111-1111-1111-1111-111111111111",
"deviceClass": "Windows.Desktop"
},
"protocol": {
"devMake": "1",
"devModel": "1",
"ticketKeys": [
"1"
]
},
"user": {
"localId": "w:11111111-1111-1111-1111-111111111111"
},
"loc": {
"tz": "+01:00"
}
},
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "CarAddedToGarage",
"serviceConfigId": "19020100-9575-4c2b-9916-3d664ce1dfab",
"playerSessionId": "11111111-1111-1111-1111-111111111111",
"titleId": "1289871275",
"userId": "REPLACEXUID",
"ver": 1,
"properties": {
"BuildNum": 156858,
"CarId": 302,
"IsHorizonEdition": 0,
"NumCarsInGarage": 20,
"Track": 552
}
}
}
}
This section guides you through the process of setting up your system to view events.
To monitor events and use the event-based unlocker in the tool, you need to install Wireshark and Frida and configure them.
The easiest way to install frida is using python pip. You can install frida by running the command
pip install frida-tools
You can view all install methods on the github repository: https://github.com/frida/frida
Warning
You must do the following steps if you are using Windows 11
- Open Windows Security
- App & Browser Control>Exploit Protection>Programme Settings
- Press the plus, Select program by name and enter
lsass.exe
- Scroll down until you see
Hardware Enforced Stack Protection
- Copy these settings:
You also need a script to extract data from lsass. Download the following script and save it somewhere you will remember for the Viewing Events section
-
Install wireshark using the installer on the website
-
Make an empty file on the root of your C: drive
C:\keylog.log
-
Open wireshark and go to Edit>Preferences
-
Click on Name Resolution and make sure your settings are set like this:
-
Go to Protocols>TLS and then select
C:keylog.log
as (Pre)-Master-Secret log filename
- Press Win+R and type in
services.msc
- Open this and scroll until you see
Connected User Experiences and Telemetry
- Double click this and change the
Startup Type
toAutomatic
- Restart (maybe?)
This section explains how to use Wireshark and Frida to view events from an event-based game.
-
Open an administrator terminal
-
Run frida using the following command
frida lsass.exe -l \Path\To\keylog.js
-
You should get output like this:
-
Open wireshark and select your network interface
-
Put the following string into your filter box
tls && http2 && ip.dst_host contains "cloudapp.azure.com"
-
Open your game of choice and start doing things
-
Look back at wireshark and you will (hopefully) see requests to a few cloudapp.azure.com domains
-
Now click on "DATA" and then navigate to
Uncompressed entity body
-
You can now read events (yay)
This section will be relatively bare as I assume anyone who wants to test and play around with events like this is smart enough to figure stuff out with minimal handholding. I will be using the visual studio code extension Thunder Client
but any HTTP client will do
To start off you will need an event to work with. Get one from the Viewing Events section
Now not all headers are required. You only need the following headers:
All headers other than tickets
and authxtoken
are static.
The json body cannot be formatted. The endpoint will throw back a parsing error if it is. Use a json minifier before sending the data away if you want to edit it while it is formatted nicely.
You must also increment the seq
value every time after sending an event. This increment does not need to be by 1 so if you lose your place you can just add 100 or 1000 to the value
The endpoint is nice about formatting errors and it tells you when they exist but other than that it is pretty quiet about errors. If any of your auth tokens are expired it will silently fail while giving a 200 response and the same acc 1 json it would on a success. The same goes for not incrementing seq
The tool supports manually defined achievement criteria and has a stats editor in progress.
To use the event-based functionality in the tool, you need to input your own events token.
- Follow the guide for Viewing Events
- Instead of clicking on
DATA
click onHEADERS
- You want to scroll until you see a tickets header that starts with something like
"2145125"="x:XBL3.0 x="
(The number will be different) - Copy from the start of
x:XBL3.0 x=
and stop before the last"
. You should completely skip the number and anything before the first x - Your copied token should look something like this
x:XBL3.0 x=somenumbers;a very large amount of letters
- You now have a usable Events Token to input into the tool
This section explains how to add support for a game, find the correct events and stats, and prepare a template and criteria.
These achievements work similarly to title-based games and only require an ID input into a generic "achievement unlocked" event.
As an example here is the data section of a Gears of War 4 event called Microsoft.XboxLive.T552499398.UnlockAchievement
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "UnlockAchievement",
"serviceConfigId": "780f0100-3c66-41ff-b8cc-964f20ee78c6",
"playerSessionId": "11111111-1111-1111-1111-111111111111",
"titleId": "552499398",
"userId": "1234567890123456",
"ver": 1,
"properties": {
"AchievementID": 1,
"MatchId": "Front End",
"MatchJoinId": 0
},
"measurements": {
"ProgressPercent": 1
}
}
}
These achievements are very easy to unlock and don't require much work to support as you can just try every AchivementID and then take note of which achievements unlock to then write the criteria.
These achievements require specific stats to be unlocked. These achievements are much harder to work with and take more work to support (usually due to multiple requirements per achievement). As an example I will use the data section of a Halo MCC event called Microsoft.XboxLive.T1144039928.MissionCompleted
This is a generic Mission Complete event which means it will handle most if not all mission completion achievements for this game.
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "MissionCompleted",
"serviceConfigId": "77290100-225e-4768-9373-98164430a9f8",
"titleId": "1144039928",
"userId": "1234567890123456",
"properties": {
"Coop": 0,
"DatePlayedUTC": 133577376536650000,
"DifficultyId": 1,
"GameCategoryId": 18,
"HaloTitleId": "HaloReach",
"Kills": 358,
"MapId": 179,
"MissionScore64": 235767,
"NumPlayers": 1,
"Penalties": 0,
"PlayerSectionStats": "{\\\"scores\\\":[0.0,0.0,1553.0,2669.0,3398.0],\\\"interpolatedScores\\\":[0.0,0.0,4659.0,7995.43408203125,7169.02197265625],\\\"times\\\":[0,1,2,3,4],\\\"sectionIDs\\\":[652215696,534971578,329253778,976357054,976684729],\\\"deaths\\\":0,\\\"numPlayers\\\":1,\\\"skullMask\\\":0,\\\"skullCount\\\":0}",
"SkullUsedFlags": 0,
"TimePlayedMS": 92356,
"TotalCoopMissionsComplete": 0,
"TotalSoloMissionsComplete": 2
},
"measurements": {
"Multiplier": 2.35,
"SkullMultiplier": 1
}
}
}
As you can see there is a significant amount of data in this data section. For example, to meet criteria for a mission complete the only thing needed is the correct MapId
however if you wanted to unlock the achievement for par score you would also need a MissionScore64
value above the par score criteria, the same goes for par time and TimePlayedMS
although you would want it under the criteria in that case. Guessing from other data available this event could also be used to get the achievements for LASO runs and possibly even some kill related achievements.
Each game needs a template, I will be using Halo MCC as an example for this section. I will show criteria for both a Good Luck and a Bad Luck achievement. You first need to anonymise the event using the Anonymising Events section Now you need to figure out which criteria you need to create and where you would need to place these criteria
The criteria replace certain strings within the template.
This is the most common type of replacement for criteria and the most simple. Example from Achievement 900 from halo MCC
"Replacement1": {
"ReplacementType": "Replace",
"Target": "REPLACEMAPID",
"Replacement": 179
},
This replaces the string REPLACEMAPID
with the number 179
This type of replacement will be required when data is on leaderboards like halo MCC where I would not like all users to have exactly the same statistics as well as for other achievements relating to clearing something within a certain time. Example from Achievement 900 from halo MCC:
"Replacement3": {
"ReplacementType": "RangeInt",
"Target": "REPLACEMISSIONSCORE",
"Min": 12750,
"Max": 14999
},
This replaces the string REPLACEMISSIONSCORE
with a number between 12750
and 14999
This type of replacement is the same as the above but for Float numbers instead of Integers
Example from Achievement 900 from halo MCC:
"Replacement5": {
"ReplacementType": "RangeFloat",
"Target": "REPLACEMULTIPLIER",
"Min": 1,
"Max": 2
},
This replaces the string REPLACEMULTIPLIER
with a float between 1
and 2
These replacements are either required by the tool or are created as exceptions to fill out data otherwise impossible.
They currently consist of:
- REPLACEXUID (Required)
- REPLACETIME (Required)
- REPLACESEQ (Required)
- LDAP timestamp (Exception: Created for Halo MCC mission completion timestamp)
The order of the criteria within the data.json file is important as the tool starts from the top and works its way down. This allows you to replace parts of data you have previously placed.
In this example, I will be using Gears Of War 4
{
"ver": "4.0",
"name": "Microsoft.XboxLive.T552499398.UnlockAchievement",
"time": "REPLACETIME",
"iKey": "o:0890af88a9ed4cc886a14f5e174a2827",
"ext": {
"utc": {
"shellId": 1,
"eventFlags": 1,
"pgName": "XBOX",
"flags": 1,
"epoch": "1",
"seq": REPLACESEQ
},
"privacy": {
"isRequired": false
},
"metadata": {
"f": {
"baseData": {
"f": {
"properties": {
"f": {
"AchievementID": 1,
"MatchJoinId": 1
}
},
"measurements": {
"f": {
"ProgressPercent": 1
}
}
}
}
},
"policies": 0
},
"os": {
"bootId": 1,
"name": "1",
"ver": "1",
"expId": "1"
},
"app": {
"id": "U:Microsoft.SpartaUWP_14.4.0.2_x64__8wekyb3d8bbwe!GearGameShippingPublic",
"ver": "14.4.0.2_x64_!2019/06/27:23:38:26!9474C5E!geargame.exe",
"is1P": 1,
"asId": 1
},
"device": {
"localId": "s:11111111-1111-1111-1111-111111111111",
"deviceClass": "Windows.Desktop"
},
"protocol": {
"devMake": "1",
"devModel": "1",
"ticketKeys": [
"1"
]
},
"user": {
"localId": "s:11111111-1111-1111-1111-111111111111"
},
"loc": {
"tz": "00:00"
}
},
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "UnlockAchievement",
"serviceConfigId": "780f0100-3c66-41ff-b8cc-964f20ee78c6",
"playerSessionId": "11111111-1111-1111-1111-111111111111",
"titleId": "552499398",
"userId": "REPLACEXUID",
"ver": 1,
"properties": {
"AchievementID": 4,
"MatchId": "11111111-1111-1111-1111-111111111111",
"MatchJoinId": 0
},
"measurements": {
"ProgressPercent": 1
}
}
}
}
In this case, it would be the AchievementID which is 4. We can check our recently unlocked achievements to see that this ID matches up with the Triple Play achievement which is ID 70 on the API
Knowing that AchievementId is our only important value we can set up the template like this:
{
"ver": "4.0",
"name": "Microsoft.XboxLive.T552499398.UnlockAchievement",
"time": "REPLACETIME",
"iKey": "o:0890af88a9ed4cc886a14f5e174a2827",
"ext": {
"utc": {
"shellId": 1,
"eventFlags": 1,
"pgName": "XBOX",
"flags": 1,
"epoch": "1",
"seq": REPLACESEQ
},
"privacy": {
"isRequired": false
},
"metadata": {
"f": {
"baseData": {
"f": {
"properties": {
"f": {
"AchievementID": 1,
"MatchJoinId": 1
}
},
"measurements": {
"f": {
"ProgressPercent": 1
}
}
}
}
},
"policies": 0
},
"os": {
"bootId": 1,
"name": "1",
"ver": "1",
"expId": "1"
},
"app": {
"id": "U:Microsoft.SpartaUWP_14.4.0.2_x64__8wekyb3d8bbwe!GearGameShippingPublic",
"ver": "14.4.0.2_x64_!2019/06/27:23:38:26!9474C5E!geargame.exe",
"is1P": 1,
"asId": 1
},
"device": {
"localId": "s:11111111-1111-1111-1111-111111111111",
"deviceClass": "Windows.Desktop"
},
"protocol": {
"devMake": "1",
"devModel": "1",
"ticketKeys": [
"1"
]
},
"user": {
"localId": "s:11111111-1111-1111-1111-111111111111"
},
"loc": {
"tz": "00:00"
}
},
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "UnlockAchievement",
"serviceConfigId": "780f0100-3c66-41ff-b8cc-964f20ee78c6",
"playerSessionId": "11111111-1111-1111-1111-111111111111",
"titleId": "552499398",
"userId": "REPLACEXUID",
"ver": 1,
"properties": {
"AchievementID": REPLACECRITERIA1,
"MatchId": "11111111-1111-1111-1111-111111111111",
"MatchJoinId": 0
},
"measurements": {
"ProgressPercent": 1
}
}
}
}
REPLACECRITERIA1
is the only thing we need to change to unlock these Good Luck achievements.
This file will be saved as the TitleID 552499398.json
Open Data.json
and check to see if 552499398
is already in the SupportedTitleIDs
list. It is not, meaning we need to add a new game entry to this file. The only supported game is currently Halo MCC
First, add the title ID to SupportedTitleIDs
"SupportedTitleIDs": [
1144039928,
552499398
]
Secondly, create a new section within the json file
"552499398": {
"FullySupported": false,
"Achievements": {
}
}
The json file should now look like this:
We know that 4 matches up with achievement id 70 so we will add this
"552499398": {
"FullySupported": false,
"Achievements": {
"70": {
"CriteriaReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACECRITERIA1",
"Replacement": "4"
}
}
}
},
The majority of this guide is the same as Good Luck achievement so I will only go over the changes
{
"ver": "4.0",
"name": "Microsoft.XboxLive.T1144039928.MissionCompleted",
"time": "REPLACETIME",
"iKey": "o:0890af88a9ed4cc886a14f5e174a2827",
"ext": {
"utc": {
"shellId": 1,
"eventFlags": 1,
"pgName": "XBOX",
"flags": 1,
"epoch": "1",
"seq": REPLACESEQ
},
"privacy": {
"dataType": 1,
"isRequired": false
},
"metadata": {
"f": {
"baseData": {
"f": {
"properties": {
"f": {
"AchievementId": 1
}
},
"ver": 1
}
}
},
"privTags": 1,
"policies": 0
},
"os": {
"bootId": 1,
"name": "1",
"ver": "1",
"expId": "1"
},
"app": {
"id": "U:Microsoft.Chelan_1.3385.0.0_x64__8wekyb3d8bbwe!HaloMCCShipping",
"ver": "1.3385.0.0_x64_!2024/01/03:17:50:38!3E58AE2!mccwinstore-win64-shipping.exe",
"is1P": 1,
"asId": 1
},
"device": {
"localId": "s:11111111-1111-1111-1111-111111111111",
"deviceClass": "Windows.Desktop"
},
"protocol": {
"devMake": "1",
"devModel": "1",
"ticketKeys": [
"1"
]
},
"user": {
"localId": "m:11111111111111111"
},
"loc": {
"tz": "00:00"
}
},
"data": {
"baseType": "Microsoft.XboxLive.InGame",
"baseData": {
"name": "MissionCompleted",
"serviceConfigId": "77290100-225e-4768-9373-98164430a9f8",
"titleId": "1144039928",
"userId": "REPLACEXUID",
"properties": {
"Coop": 0,
"DatePlayedUTC": 133583987328905914,
"DifficultyId": 1,
"GameCategoryId": 18,
"HaloTitleId": "HaloReach",
"Kills": 257,
"MapId": 179,
"MissionScore64": 13327,
"NumPlayers": 1,
"Penalties": 0,
"PlayerSectionStats": "{\\\"scores\\\":[0.0,1.0,2.0,3.0,4.0],\\\"interpolatedScores\\\":[0.0,1.0,2.0,3.0,4.0],\\\"times\\\":[0,1,2,3,4],\\\"sectionIDs\\\":[1,2,3,4,5],\\\"deaths\\\":0,\\\"numPlayers\\\":1,\\\"skullMask\\\":0,\\\"skullCount\\\":0}",
"SkullUsedFlags": 0,
"TimePlayedMS": 1014169,
"TotalCoopMissionsComplete": 0,
"TotalSoloMissionsComplete": 1
},
"measurements": {
"Multiplier": 1.3916192,
"SkullMultiplier": 1
}
}
}
}
There are lots of important values in this section however we are only focusing on Par Time, Par score and normal completion achievements. I know this event is for the level winter contingency which I will assume is MapId
179. I can assume I will need a MissionScore64
of >15000 for the Par score achievement and a TimePlayedMS
of <900000 for the Par time achievement. Kills
and DatePlayedUTC
are also important values but have no bearing on the achievement criteria for the achievements we are currently working on
Step not required as MCC is already supported
Step not required as MCC is already supported
I will be adding three achievements here. Due to MCC having both bad luck and good luck achievements I need to replace the event name and data section for every achievement. These three achievements will be: We're Just Getting Started (900)
, Winter Urgency(915)
Ice In Your Veins(925)
"900": {
"EventReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEEVENT",
"Replacement": "Microsoft.XboxLive.T1144039928.MissionCompleted"
},
"DataReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEDATA",
"Replacement": "{\"baseType\":\"Microsoft.XboxLive.InGame\",\"baseData\":{\"name\":\"MissionCompleted\",\"serviceConfigId\":\"77290100-225e-4768-9373-98164430a9f8\",\"titleId\":\"1144039928\",\"userId\":\"REPLACEXUID\",\"properties\":{\"Coop\":0,\"DatePlayedUTC\":REPLACEDATEPLAYED,\"DifficultyId\":1,\"GameCategoryId\":18,\"HaloTitleId\":\"HaloReach\",\"Kills\":REPLACEKILLS,\"MapId\":REPLACEMAPID,\"MissionScore64\":REPLACEMISSIONSCORE,\"NumPlayers\":1,\"Penalties\":0,\"PlayerSectionStats\":\"{\\\\\\\"scores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"interpolatedScores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"times\\\\\\\":[0,1,2,3,4],\\\\\\\"sectionIDs\\\\\\\":[1,2,3,4,5],\\\\\\\"deaths\\\\\\\":0,\\\\\\\"numPlayers\\\\\\\":1,\\\\\\\"skullMask\\\\\\\":0,\\\\\\\"skullCount\\\\\\\":0}\",\"SkullUsedFlags\":0,\"TimePlayedMS\":REPLACETIMEPLAYED,\"TotalCoopMissionsComplete\":0,\"TotalSoloMissionsComplete\":1},\"measurements\":{\"Multiplier\":REPLACEMULTIPLIER,\"SkullMultiplier\":1}}}"
},
"Replacement1": {
"ReplacementType": "Replace",
"Target": "REPLACEMAPID",
"Replacement": 179
},
"Replacement2": {
"ReplacementType": "RangeInt",
"Target": "REPLACEKILLS",
"Min": 200,
"Max": 300
},
"Replacement3": {
"ReplacementType": "RangeInt",
"Target": "REPLACEMISSIONSCORE",
"Min": 12750,
"Max": 14999
},
"Replacement4": {
"ReplacementType": "RangeInt",
"Target": "REPLACETIMEPLAYED",
"Min": 900001,
"Max": 1035000
},
"Replacement5": {
"ReplacementType": "RangeFloat",
"Target": "REPLACEMULTIPLIER",
"Min": 1,
"Max": 2
},
"Replacement6": {
"ReplacementType": "StupidFuckingLDAPTimestamp",
"Target": "REPLACEDATEPLAYED"
}
},
"915": {
"EventReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEEVENT",
"Replacement": "Microsoft.XboxLive.T1144039928.MissionCompleted"
},
"DataReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEDATA",
"Replacement": "{\"baseType\":\"Microsoft.XboxLive.InGame\",\"baseData\":{\"name\":\"MissionCompleted\",\"serviceConfigId\":\"77290100-225e-4768-9373-98164430a9f8\",\"titleId\":\"1144039928\",\"userId\":\"REPLACEXUID\",\"properties\":{\"Coop\":0,\"DatePlayedUTC\":REPLACEDATEPLAYED,\"DifficultyId\":1,\"GameCategoryId\":18,\"HaloTitleId\":\"HaloReach\",\"Kills\":REPLACEKILLS,\"MapId\":REPLACEMAPID,\"MissionScore64\":REPLACEMISSIONSCORE,\"NumPlayers\":1,\"Penalties\":0,\"PlayerSectionStats\":\"{\\\\\\\"scores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"interpolatedScores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"times\\\\\\\":[0,1,2,3,4],\\\\\\\"sectionIDs\\\\\\\":[1,2,3,4,5],\\\\\\\"deaths\\\\\\\":0,\\\\\\\"numPlayers\\\\\\\":1,\\\\\\\"skullMask\\\\\\\":0,\\\\\\\"skullCount\\\\\\\":0}\",\"SkullUsedFlags\":0,\"TimePlayedMS\":REPLACETIMEPLAYED,\"TotalCoopMissionsComplete\":0,\"TotalSoloMissionsComplete\":1},\"measurements\":{\"Multiplier\":REPLACEMULTIPLIER,\"SkullMultiplier\":1}}}"
},
"Replacement1": {
"ReplacementType": "Replace",
"Target": "REPLACEMAPID",
"Replacement": 179
},
"Replacement2": {
"ReplacementType": "RangeInt",
"Target": "REPLACEKILLS",
"Min": 200,
"Max": 300
},
"Replacement3": {
"ReplacementType": "RangeInt",
"Target": "REPLACEMISSIONSCORE",
"Min": 12750,
"Max": 14999
},
"Replacement4": {
"ReplacementType": "RangeInt",
"Target": "REPLACETIMEPLAYED",
"Min": 765000,
"Max": 899999
},
"Replacement5": {
"ReplacementType": "RangeFloat",
"Target": "REPLACEMULTIPLIER",
"Min": 1,
"Max": 2
},
"Replacement6": {
"ReplacementType": "StupidFuckingLDAPTimestamp",
"Target": "REPLACEDATEPLAYED"
}
},
"925": {
"EventReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEEVENT",
"Replacement": "Microsoft.XboxLive.T1144039928.MissionCompleted"
},
"DataReplacement": {
"ReplacementType": "Replace",
"Target": "REPLACEDATA",
"Replacement": "{\"baseType\":\"Microsoft.XboxLive.InGame\",\"baseData\":{\"name\":\"MissionCompleted\",\"serviceConfigId\":\"77290100-225e-4768-9373-98164430a9f8\",\"titleId\":\"1144039928\",\"userId\":\"REPLACEXUID\",\"properties\":{\"Coop\":0,\"DatePlayedUTC\":REPLACEDATEPLAYED,\"DifficultyId\":1,\"GameCategoryId\":18,\"HaloTitleId\":\"HaloReach\",\"Kills\":REPLACEKILLS,\"MapId\":REPLACEMAPID,\"MissionScore64\":REPLACEMISSIONSCORE,\"NumPlayers\":1,\"Penalties\":0,\"PlayerSectionStats\":\"{\\\\\\\"scores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"interpolatedScores\\\\\\\":[0.0,1.0,2.0,3.0,4.0],\\\\\\\"times\\\\\\\":[0,1,2,3,4],\\\\\\\"sectionIDs\\\\\\\":[1,2,3,4,5],\\\\\\\"deaths\\\\\\\":0,\\\\\\\"numPlayers\\\\\\\":1,\\\\\\\"skullMask\\\\\\\":0,\\\\\\\"skullCount\\\\\\\":0}\",\"SkullUsedFlags\":0,\"TimePlayedMS\":REPLACETIMEPLAYED,\"TotalCoopMissionsComplete\":0,\"TotalSoloMissionsComplete\":1},\"measurements\":{\"Multiplier\":REPLACEMULTIPLIER,\"SkullMultiplier\":1}}}"
},
"Replacement1": {
"ReplacementType": "Replace",
"Target": "REPLACEMAPID",
"Replacement": 179
},
"Replacement2": {
"ReplacementType": "RangeInt",
"Target": "REPLACEKILLS",
"Min": 200,
"Max": 300
},
"Replacement3": {
"ReplacementType": "RangeInt",
"Target": "REPLACEMISSIONSCORE",
"Min": 15001,
"Max": 17250
},
"Replacement4": {
"ReplacementType": "RangeInt",
"Target": "REPLACETIMEPLAYED",
"Min": 900001,
"Max": 1035000
},
"Replacement5": {
"ReplacementType": "RangeFloat",
"Target": "REPLACEMULTIPLIER",
"Min": 1,
"Max": 2
},
"Replacement6": {
"ReplacementType": "StupidFuckingLDAPTimestamp",
"Target": "REPLACEDATEPLAYED"
}
}
}
This section is under construction.