├── .gitattributes
├── .gitignore
├── BL3ProfileEditor
├── App.config
├── App.xaml
├── App.xaml.cs
├── BL3ProfileEditor.csproj
├── BL3ProfileEditor.sln
├── Borderlands 3 004 512 x 512 ICO.ico
├── Debug
│ ├── DebugConsole.xaml
│ ├── DebugConsole.xaml.cs
│ └── RedirectWriter.cs
├── Editor.xaml
├── Editor.xaml.cs
├── PackageIO.dll
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ └── launchSettings.json
├── Protobufs
│ ├── Decryption
│ │ ├── CRC32.cs
│ │ ├── ProfileBogoCrypt.cs
│ │ └── SaveBogoCrypt.cs
│ ├── Definitions
│ │ ├── OakProfile.cs
│ │ ├── OakSave.cs
│ │ └── OakShared.cs
│ ├── GVAS
│ │ └── GVASData.cs
│ ├── Helpers
│ │ └── Helpers.cs
│ ├── OakProfile.proto
│ ├── OakSave.proto
│ ├── OakShared.proto
│ └── Translations
│ │ └── DataPathTranslations.cs
└── versionInformation.txt
├── CosmeticsGenerator
├── CosmeticsDownloader.py
├── CosmeticsGenerator.pyproj
├── output.txt
└── sheetData.xlsx
├── LICENSE
├── README.md
└── versionInformation.txt
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Bbin]/[Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Aa][Rr][Mm]/
27 | [Aa][Rr][Mm]64/
28 | bld/
29 | [Bb]in/
30 | [Oo]bj/
31 | [Ll]og/
32 |
33 | # Visual Studio 2015/2017 cache/options directory
34 | .vs/
35 | # Uncomment if you have tasks that create the project's static files in wwwroot
36 | #wwwroot/
37 |
38 | # Visual Studio 2017 auto generated files
39 | Generated\ Files/
40 |
41 | # MSTest test Results
42 | [Tt]est[Rr]esult*/
43 | [Bb]uild[Ll]og.*
44 |
45 | # NUnit
46 | *.VisualState.xml
47 | TestResult.xml
48 | nunit-*.xml
49 |
50 | # Build Results of an ATL Project
51 | [Dd]ebugPS/
52 | [Rr]eleasePS/
53 | dlldata.c
54 |
55 | # Benchmark Results
56 | BenchmarkDotNet.Artifacts/
57 |
58 | # .NET Core
59 | project.lock.json
60 | project.fragment.lock.json
61 | artifacts/
62 |
63 | # StyleCop
64 | StyleCopReport.xml
65 |
66 | # Files built by Visual Studio
67 | *_i.c
68 | *_p.c
69 | *_h.h
70 | *.ilk
71 | *.meta
72 | *.obj
73 | *.iobj
74 | *.pch
75 | *.pdb
76 | *.ipdb
77 | *.pgc
78 | *.pgd
79 | *.rsp
80 | *.sbr
81 | *.tlb
82 | *.tli
83 | *.tlh
84 | *.tmp
85 | *.tmp_proj
86 | *_wpftmp.csproj
87 | *.log
88 | *.vspscc
89 | *.vssscc
90 | .builds
91 | *.pidb
92 | *.svclog
93 | *.scc
94 |
95 | # Chutzpah Test files
96 | _Chutzpah*
97 |
98 | # Visual C++ cache files
99 | ipch/
100 | *.aps
101 | *.ncb
102 | *.opendb
103 | *.opensdf
104 | *.sdf
105 | *.cachefile
106 | *.VC.db
107 | *.VC.VC.opendb
108 |
109 | # Visual Studio profiler
110 | *.psess
111 | *.vsp
112 | *.vspx
113 | *.sap
114 |
115 | # Visual Studio Trace Files
116 | *.e2e
117 |
118 | # TFS 2012 Local Workspace
119 | $tf/
120 |
121 | # Guidance Automation Toolkit
122 | *.gpState
123 |
124 | # ReSharper is a .NET coding add-in
125 | _ReSharper*/
126 | *.[Rr]e[Ss]harper
127 | *.DotSettings.user
128 |
129 | # JustCode is a .NET coding add-in
130 | .JustCode
131 |
132 | # TeamCity is a build add-in
133 | _TeamCity*
134 |
135 | # DotCover is a Code Coverage Tool
136 | *.dotCover
137 |
138 | # AxoCover is a Code Coverage Tool
139 | .axoCover/*
140 | !.axoCover/settings.json
141 |
142 | # Visual Studio code coverage results
143 | *.coverage
144 | *.coveragexml
145 |
146 | # NCrunch
147 | _NCrunch_*
148 | .*crunch*.local.xml
149 | nCrunchTemp_*
150 |
151 | # MightyMoose
152 | *.mm.*
153 | AutoTest.Net/
154 |
155 | # Web workbench (sass)
156 | .sass-cache/
157 |
158 | # Installshield output folder
159 | [Ee]xpress/
160 |
161 | # DocProject is a documentation generator add-in
162 | DocProject/buildhelp/
163 | DocProject/Help/*.HxT
164 | DocProject/Help/*.HxC
165 | DocProject/Help/*.hhc
166 | DocProject/Help/*.hhk
167 | DocProject/Help/*.hhp
168 | DocProject/Help/Html2
169 | DocProject/Help/html
170 |
171 | # Click-Once directory
172 | publish/
173 |
174 | # Publish Web Output
175 | *.[Pp]ublish.xml
176 | *.azurePubxml
177 | # Note: Comment the next line if you want to checkin your web deploy settings,
178 | # but database connection strings (with potential passwords) will be unencrypted
179 | *.pubxml
180 | *.publishproj
181 |
182 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
183 | # checkin your Azure Web App publish settings, but sensitive information contained
184 | # in these scripts will be unencrypted
185 | PublishScripts/
186 |
187 | # NuGet Packages
188 | *.nupkg
189 | # NuGet Symbol Packages
190 | *.snupkg
191 | # The packages folder can be ignored because of Package Restore
192 | **/[Pp]ackages/*
193 | # except build/, which is used as an MSBuild target.
194 | !**/[Pp]ackages/build/
195 | # Uncomment if necessary however generally it will be regenerated when needed
196 | #!**/[Pp]ackages/repositories.config
197 | # NuGet v3's project.json files produces more ignorable files
198 | *.nuget.props
199 | *.nuget.targets
200 |
201 | # Microsoft Azure Build Output
202 | csx/
203 | *.build.csdef
204 |
205 | # Microsoft Azure Emulator
206 | ecf/
207 | rcf/
208 |
209 | # Windows Store app package directories and files
210 | AppPackages/
211 | BundleArtifacts/
212 | Package.StoreAssociation.xml
213 | _pkginfo.txt
214 | *.appx
215 | *.appxbundle
216 | *.appxupload
217 |
218 | # Visual Studio cache files
219 | # files ending in .cache can be ignored
220 | *.[Cc]ache
221 | # but keep track of directories ending in .cache
222 | !?*.[Cc]ache/
223 |
224 | # Others
225 | ClientBin/
226 | ~$*
227 | *~
228 | *.dbmdl
229 | *.dbproj.schemaview
230 | *.jfm
231 | *.pfx
232 | *.publishsettings
233 | orleans.codegen.cs
234 |
235 | # Including strong name files can present a security risk
236 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
237 | #*.snk
238 |
239 | # Since there are multiple workflows, uncomment next line to ignore bower_components
240 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
241 | #bower_components/
242 |
243 | # RIA/Silverlight projects
244 | Generated_Code/
245 |
246 | # Backup & report files from converting an old project file
247 | # to a newer Visual Studio version. Backup files are not needed,
248 | # because we have git ;-)
249 | _UpgradeReport_Files/
250 | Backup*/
251 | UpgradeLog*.XML
252 | UpgradeLog*.htm
253 | ServiceFabricBackup/
254 | *.rptproj.bak
255 |
256 | # SQL Server files
257 | *.mdf
258 | *.ldf
259 | *.ndf
260 |
261 | # Business Intelligence projects
262 | *.rdl.data
263 | *.bim.layout
264 | *.bim_*.settings
265 | *.rptproj.rsuser
266 | *- [Bb]ackup.rdl
267 | *- [Bb]ackup ([0-9]).rdl
268 | *- [Bb]ackup ([0-9][0-9]).rdl
269 |
270 | # Microsoft Fakes
271 | FakesAssemblies/
272 |
273 | # GhostDoc plugin setting file
274 | *.GhostDoc.xml
275 |
276 | # Node.js Tools for Visual Studio
277 | .ntvs_analysis.dat
278 | node_modules/
279 |
280 | # Visual Studio 6 build log
281 | *.plg
282 |
283 | # Visual Studio 6 workspace options file
284 | *.opt
285 |
286 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
287 | *.vbw
288 |
289 | # Visual Studio LightSwitch build output
290 | **/*.HTMLClient/GeneratedArtifacts
291 | **/*.DesktopClient/GeneratedArtifacts
292 | **/*.DesktopClient/ModelManifest.xml
293 | **/*.Server/GeneratedArtifacts
294 | **/*.Server/ModelManifest.xml
295 | _Pvt_Extensions
296 |
297 | # Paket dependency manager
298 | .paket/paket.exe
299 | paket-files/
300 |
301 | # FAKE - F# Make
302 | .fake/
303 |
304 | # CodeRush personal settings
305 | .cr/personal
306 |
307 | # Python Tools for Visual Studio (PTVS)
308 | __pycache__/
309 | *.pyc
310 |
311 | # Cake - Uncomment if you are using it
312 | # tools/**
313 | # !tools/packages.config
314 |
315 | # Tabs Studio
316 | *.tss
317 |
318 | # Telerik's JustMock configuration file
319 | *.jmconfig
320 |
321 | # BizTalk build output
322 | *.btp.cs
323 | *.btm.cs
324 | *.odx.cs
325 | *.xsd.cs
326 |
327 | # OpenCover UI analysis results
328 | OpenCover/
329 |
330 | # Azure Stream Analytics local run output
331 | ASALocalRun/
332 |
333 | # MSBuild Binary and Structured Log
334 | *.binlog
335 |
336 | # NVidia Nsight GPU debugger configuration file
337 | *.nvuser
338 |
339 | # MFractors (Xamarin productivity tool) working folder
340 | .mfractor/
341 |
342 | # Local History for Visual Studio
343 | .localhistory/
344 |
345 | # BeatPulse healthcheck temp database
346 | healthchecksdb
347 |
348 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
349 | MigrationBackup/
350 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/App.xaml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Configuration;
4 | using System.Data;
5 | using System.Linq;
6 | using System.Threading.Tasks;
7 | using System.Windows;
8 |
9 | namespace BL3ProfileEditor
10 | {
11 | ///
12 | /// Interaction logic for App.xaml
13 | ///
14 | public partial class App : Application
15 | {
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/BL3ProfileEditor.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | WinExe
4 | netcoreapp3.0
5 | true
6 | false
7 | Borderlands 3 004 512 x 512 ICO.ico
8 | BL3ProfileEditor.App
9 |
10 | win-x86
11 | true
12 | true
13 | https://github.com/FromDarkHell/BL3ProfileEditor
14 |
15 |
16 |
17 |
18 | 2.0.0
19 |
20 |
21 | 4.2.0
22 |
23 |
24 | 2.4.6
25 |
26 |
27 |
28 |
29 |
30 | PackageIO.dll
31 |
32 |
33 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/BL3ProfileEditor.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.29006.145
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BL3ProfileEditor", "BL3ProfileEditor.csproj", "{23B58253-91AC-49A5-9769-1C0CEBD650A0}"
7 | EndProject
8 | Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "CosmeticsGenerator", "..\CosmeticsGenerator\CosmeticsGenerator.pyproj", "{34E5A226-3079-4DE1-9467-566714DE8623}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Debug|x86 = Debug|x86
14 | Release|Any CPU = Release|Any CPU
15 | Release|x86 = Release|x86
16 | EndGlobalSection
17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
18 | {23B58253-91AC-49A5-9769-1C0CEBD650A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
19 | {23B58253-91AC-49A5-9769-1C0CEBD650A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
20 | {23B58253-91AC-49A5-9769-1C0CEBD650A0}.Debug|x86.ActiveCfg = Debug|Any CPU
21 | {23B58253-91AC-49A5-9769-1C0CEBD650A0}.Debug|x86.Build.0 = Debug|Any CPU
22 | {23B58253-91AC-49A5-9769-1C0CEBD650A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {23B58253-91AC-49A5-9769-1C0CEBD650A0}.Release|Any CPU.Build.0 = Release|Any CPU
24 | {23B58253-91AC-49A5-9769-1C0CEBD650A0}.Release|x86.ActiveCfg = Release|Any CPU
25 | {23B58253-91AC-49A5-9769-1C0CEBD650A0}.Release|x86.Build.0 = Release|Any CPU
26 | {34E5A226-3079-4DE1-9467-566714DE8623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
27 | {34E5A226-3079-4DE1-9467-566714DE8623}.Debug|x86.ActiveCfg = Debug|Any CPU
28 | {34E5A226-3079-4DE1-9467-566714DE8623}.Release|Any CPU.ActiveCfg = Release|Any CPU
29 | {34E5A226-3079-4DE1-9467-566714DE8623}.Release|x86.ActiveCfg = Release|Any CPU
30 | EndGlobalSection
31 | GlobalSection(SolutionProperties) = preSolution
32 | HideSolutionNode = FALSE
33 | EndGlobalSection
34 | GlobalSection(ExtensibilityGlobals) = postSolution
35 | SolutionGuid = {6935F92D-7676-4B8E-A876-D6E23958560C}
36 | EndGlobalSection
37 | EndGlobal
38 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Borderlands 3 004 512 x 512 ICO.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FromDarkHell/BL3ProfileEditor/8b27a4e695f950746e848cac4e23e280a48c0ef1/BL3ProfileEditor/Borderlands 3 004 512 x 512 ICO.ico
--------------------------------------------------------------------------------
/BL3ProfileEditor/Debug/DebugConsole.xaml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Debug/DebugConsole.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using System.Windows;
7 | using System.Windows.Controls;
8 | using System.Windows.Data;
9 | using System.Windows.Documents;
10 | using System.Windows.Input;
11 | using System.Windows.Media;
12 | using System.Windows.Media.Imaging;
13 | using System.Windows.Shapes;
14 | using System.Windows.Threading;
15 |
16 | namespace BL3ProfileEditor.Debug
17 | {
18 | ///
19 | /// Interaction logic for DebugConsole.xaml
20 | ///
21 | public partial class DebugConsole : Window
22 | {
23 | ConsoleRedirectWriter consoleRedirectWriter;
24 |
25 | public DebugConsole()
26 | {
27 | InitializeComponent();
28 | consoleRedirectWriter = new ConsoleRedirectWriter(textBoxDebug);
29 | // Releases console when window closes.
30 | Closed += delegate (Object o, EventArgs e) { consoleRedirectWriter.Release(); };
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Debug/RedirectWriter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 | using System.Windows.Controls;
8 |
9 | namespace BL3ProfileEditor.Debug
10 | {
11 | public class RedirectWriter : StringWriter
12 | {
13 | public Action OnWrite;
14 |
15 | private void WriteGeneric(T value) { if (OnWrite != null) OnWrite(value.ToString()); }
16 |
17 | public override void Write(char value) { WriteGeneric(value); }
18 | public override void Write(string value) { WriteGeneric(value); }
19 | public override void Write(bool value) { WriteGeneric(value); }
20 | public override void Write(int value) { WriteGeneric(value); }
21 | public override void Write(double value) { WriteGeneric(value); }
22 | public override void Write(long value) { WriteGeneric(value); }
23 |
24 | private void WriteLineGeneric(T value) { if (OnWrite != null) OnWrite(value.ToString() + "\n"); }
25 | public override void WriteLine(char value) { WriteLineGeneric(value); }
26 | public override void WriteLine(string value) { WriteLineGeneric(value); }
27 | public override void WriteLine(bool value) { WriteLineGeneric(value); }
28 | public override void WriteLine(int value) { WriteLineGeneric(value); }
29 | public override void WriteLine(double value) { WriteLineGeneric(value); }
30 | public override void WriteLine(long value) { WriteLineGeneric(value); }
31 |
32 | public override void Write(char[] buffer, int index, int count)
33 | {
34 | base.Write(buffer, index, count);
35 | char[] buffer2 = new char[count]; // Ensures large buffers are not a problem
36 | for (int i = 0; i < count; i++) buffer2[i] = buffer[index + i];
37 | WriteGeneric(buffer2);
38 | }
39 |
40 | public override void WriteLine(char[] buffer, int index, int count)
41 | {
42 | base.Write(buffer, index, count);
43 | char[] buffer2 = new char[count]; // Ensures large buffers are not a problem
44 | for (int i = 0; i < count; i++) buffer2[i] = buffer[index + i];
45 | WriteLineGeneric(buffer2);
46 | }
47 | }
48 |
49 | public class ConsoleRedirectWriter : RedirectWriter
50 | {
51 | TextWriter consoleTextWriter; //keeps Visual Studio console in scope.
52 |
53 | public ConsoleRedirectWriter(TextBox c)
54 | {
55 | consoleTextWriter = Console.Out;
56 | this.OnWrite += delegate (string text) { consoleTextWriter.Write(text); c.Text += text; c.ScrollToEnd(); };
57 |
58 | Console.SetOut(this);
59 | }
60 |
61 | public void Release()
62 | {
63 | Console.SetOut(consoleTextWriter);
64 | }
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Editor.xaml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
25 |
31 |
36 |
37 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Editor.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using OakSave;
3 | using ProtoBuf;
4 | using PackageIO;
5 | using System.IO;
6 | using System.Net;
7 | using System.Linq;
8 | using Microsoft.Win32;
9 | using System.Reflection;
10 | using System.Windows.Data;
11 | using BL3ProfileEditor.Debug;
12 | using MahApps.Metro.Controls;
13 | using System.Collections.Generic;
14 | using System.Collections.ObjectModel;
15 | using MahApps.Metro.Controls.Dialogs;
16 | using BL3ProfileEditor.Protobufs.GVAS;
17 | using Gibbed.Borderlands3.SaveFormats;
18 | using Gibbed.Borderlands3.ProfileFormats;
19 | using BL3ProfileEditor.Protobufs.Helpers;
20 | using BL3ProfileEditor.Protobufs.Translations;
21 |
22 |
23 | namespace BL3ProfileEditor
24 | {
25 | ///
26 | /// Interaction logic for MainWindow.xaml
27 | ///
28 | public partial class MainWindow
29 | {
30 | public string filePath;
31 |
32 | public Profile loadedProfile;
33 |
34 | private byte[] originalBytes;
35 | private GVASSave saveData;
36 | private DebugConsole child;
37 |
38 | public MainWindow()
39 | {
40 | InitializeComponent();
41 | }
42 |
43 | #region UI Handling
44 |
45 | #region Button Clickings
46 |
47 | public async void showMessage(string title, string message)
48 | {
49 | await this.ShowMessageAsync(title, message);
50 | }
51 |
52 |
53 | #region Button Events
54 | private void OpenButton_Click(object sender, System.Windows.RoutedEventArgs e)
55 | {
56 | OpenFileDialog fileDialog = new OpenFileDialog
57 | {
58 | Title = "Select BL3 Profile",
59 | Filter = "Profile|*.sav",
60 | InitialDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "My Games", "Borderlands 3", "Saved", "SaveGames")
61 | };
62 |
63 | if (fileDialog.ShowDialog() == true)
64 | {
65 | filePath = fileDialog.FileName;
66 | LoadFileFromDisk();
67 | }
68 | }
69 |
70 | private void SaveButton_Click(object sender, System.Windows.RoutedEventArgs e)
71 | {
72 | SaveFileToDisk();
73 | }
74 |
75 | private void HelpButton_Click(object sender, System.Windows.RoutedEventArgs e)
76 | {
77 | showMessage("Help", "Made by: FromDarkHell, icon courtesy of BrokenNoah (deviantart)");
78 | }
79 |
80 | private void OpenDebugMenu(object sender, System.Windows.RoutedEventArgs e)
81 | {
82 | child = new DebugConsole();
83 | child.Show();
84 | }
85 |
86 | #region Save Editing Shenanigans
87 |
88 | #region Customizations
89 | private void UnlockCustomizations(object sender, System.Windows.RoutedEventArgs e)
90 | {
91 | List customizationAssetPaths = DataPathTranslations.GetCustomizationAssetPaths();
92 | List saveData = loadedProfile.UnlockedCustomizations;
93 | List output = new List();
94 |
95 | foreach (string assetPath in customizationAssetPaths)
96 | {
97 | string lowerAsset = assetPath.ToLower();
98 |
99 | if (lowerAsset.Contains("default") || (lowerAsset.Contains("emote") && (lowerAsset.Contains("wave") || lowerAsset.Contains("cheer") || lowerAsset.Contains("laugh") || lowerAsset.Contains("point")))) continue;
100 |
101 | bool bAlreadyOwnsCustomization = false;
102 | foreach (OakCustomizationSaveGameData customizatonData in saveData)
103 | {
104 | if (customizatonData.CustomizationAssetPath.Equals(assetPath))
105 | {
106 | bAlreadyOwnsCustomization = true;
107 | break;
108 | }
109 | }
110 | if (!bAlreadyOwnsCustomization)
111 | {
112 | OakCustomizationSaveGameData d = new OakCustomizationSaveGameData
113 | {
114 | CustomizationAssetPath = assetPath,
115 | IsNew = true
116 | };
117 | output.Add(d);
118 | Console.WriteLine("Doesn't own customization: {0}", assetPath);
119 | }
120 | }
121 | saveData.AddRange(output);
122 |
123 | // The weapon trinkets / skins use a different format so we'll want to add this
124 | List weaponOut = new List();
125 | foreach (uint assetHash in DataPathTranslations.GetWeaponCustomizationPaths())
126 | {
127 | bool bOwnsHash = false;
128 | foreach (OakInventoryCustomizationPartInfo partInfo in loadedProfile.UnlockedInventoryCustomizationParts)
129 | {
130 | if (partInfo.CustomizationPartHash.Equals(assetHash))
131 | {
132 | bOwnsHash = true;
133 | break;
134 | }
135 | }
136 | if (!bOwnsHash)
137 | {
138 | OakInventoryCustomizationPartInfo customizationInfo = new OakInventoryCustomizationPartInfo
139 | {
140 | CustomizationPartHash = assetHash,
141 | IsNew = true
142 | };
143 | weaponOut.Add(customizationInfo);
144 | }
145 | }
146 | loadedProfile.UnlockedInventoryCustomizationParts.AddRange(weaponOut);
147 | }
148 |
149 | private void LockCustomizations(object sender, System.Windows.RoutedEventArgs e)
150 | {
151 | loadedProfile.UnlockedCustomizations.RemoveRange(0, loadedProfile.UnlockedCustomizations.Count);
152 | loadedProfile.UnlockedInventoryCustomizationParts.Clear();
153 | }
154 | #endregion
155 |
156 | #region Room Decorations
157 | private void UnlockRoomDecorations(object sender, System.Windows.RoutedEventArgs e)
158 | {
159 | List roomDecos = DataPathTranslations.GetDecorationAssetPaths();
160 | foreach (string assetPath in roomDecos)
161 | {
162 | bool bAlreadyOwned = false;
163 | foreach (CrewQuartersDecorationItemSaveGameData d in loadedProfile.UnlockedCrewQuartersDecorations)
164 | {
165 | if (d.DecorationItemAssetPath.Equals(assetPath))
166 | {
167 | bAlreadyOwned = true;
168 | break;
169 | }
170 | }
171 | if (!bAlreadyOwned)
172 | {
173 | CrewQuartersDecorationItemSaveGameData d = new CrewQuartersDecorationItemSaveGameData()
174 | {
175 | DecorationItemAssetPath = assetPath,
176 | IsNew = true
177 | };
178 | loadedProfile.UnlockedCrewQuartersDecorations.Add(d);
179 | Console.WriteLine("Doesnt own room deco: {0}", assetPath);
180 | }
181 | }
182 | }
183 |
184 | private void LockRoomDecorations(object sender, System.Windows.RoutedEventArgs e)
185 | {
186 | loadedProfile.UnlockedCrewQuartersDecorations.RemoveRange(0, loadedProfile.UnlockedCrewQuartersDecorations.Count);
187 | }
188 |
189 | #endregion
190 |
191 | #region Lost Loot // Bank
192 | private void ClearLL(object sender, System.Windows.RoutedEventArgs e)
193 | {
194 | loadedProfile.LostLootInventoryLists.Clear();
195 | }
196 |
197 | private void ClearBank(object sender, System.Windows.RoutedEventArgs e)
198 | {
199 | loadedProfile.BankInventoryLists.Clear();
200 | }
201 |
202 | private List getItemCodesFromString(string str)
203 | {
204 | string totalItemCodes = str;
205 | string[] itemCodes = totalItemCodes.Split(',');
206 | Console.WriteLine("Item Codes: {0}", string.Join(",", itemCodes));
207 | List output = new List();
208 |
209 | foreach (string itemCode in itemCodes)
210 | {
211 | if (!itemCode.ToLower().StartsWith("bl3(") || !itemCode.ToLower().EndsWith(")"))
212 | continue;
213 |
214 | string base64Encoded = itemCode.Remove(0, 4);
215 | base64Encoded = base64Encoded.Remove(base64Encoded.Length - 1, 1);
216 | byte[] itemBytes = Convert.FromBase64String(base64Encoded);
217 | output.Add(itemBytes);
218 | }
219 | return output;
220 | }
221 |
222 | private void AddItemCodeToBank(object sender, System.Windows.RoutedEventArgs e)
223 | {
224 | loadedProfile.BankInventoryLists.AddRange(getItemCodesFromString(ItemCodeBox.Text));
225 |
226 | }
227 |
228 | #endregion
229 |
230 | private void InjectGRSaves(object sender, System.Windows.RoutedEventArgs e)
231 | {
232 | GRInjection();
233 | }
234 |
235 | private void GRInjection()
236 | {
237 | DirectoryInfo saveFiles = new DirectoryInfo(Path.GetDirectoryName(filePath));
238 | IEnumerable infos = saveFiles.EnumerateFiles("*.sav");
239 |
240 | foreach (FileInfo saveFile in infos) // Get all of our .sav files
241 | {
242 | if (saveFile.IsReadOnly) continue;
243 |
244 | IO io = new IO(saveFile.FullName, Endian.Little, 0x0000000, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
245 |
246 | Console.WriteLine("Reading file \"{0}\"", saveFile.FullName);
247 | GVASSave gvas = Helpers.ReadGVASSave(io);
248 |
249 | if (gvas == null || !gvas.sgType.Equals("OakSaveGame"))
250 | {
251 | Console.WriteLine("File \"{0}\" is not a save.", saveFile.FullName);
252 | continue;
253 | }
254 |
255 | int remainingDataLength = io.ReadInt32();
256 | Console.WriteLine("Length of data: {0}", remainingDataLength);
257 | byte[] buf = io.ReadBytes(remainingDataLength);
258 |
259 | SaveBogoCrypt.Decrypt(buf, 0, remainingDataLength);
260 |
261 | Character characterSave = Serializer.Deserialize(new MemoryStream(buf));
262 | Console.WriteLine("Parsing save: {0}", characterSave.PreferredCharacterName);
263 |
264 | GuardianRankCharacterSaveGameData grcd = characterSave.GuardianRankCharacterData;
265 | if (grcd == null)
266 | {
267 | io.Close();
268 | continue;
269 | }
270 |
271 | grcd.GuardianAvailableTokens = loadedProfile.GuardianRank.AvailableTokens;
272 | grcd.GuardianExperience = loadedProfile.GuardianRank.GuardianExperience;
273 | grcd.NewGuardianExperience = loadedProfile.GuardianRank.NewGuardianExperience;
274 | grcd.GuardianRewardRandomSeed = loadedProfile.GuardianRank.GuardianRewardRandomSeed;
275 | grcd.GuardianRank = loadedProfile.GuardianRank.GuardianRank;
276 | List outputGR = new List();
277 | foreach (GuardianRankRewardCharacterSaveGameData grData in grcd.RankRewards)
278 | {
279 | bool bFoundMatch = false;
280 | foreach (GuardianRankRewardSaveGameData pGRData in loadedProfile.GuardianRank.RankRewards)
281 | {
282 | if (pGRData.RewardDataPath.Equals(grData.RewardDataPath))
283 | {
284 | grData.NumTokens = pGRData.NumTokens;
285 | if (grData.NumTokens == 0)
286 | outputGR.Add(grData);
287 | bFoundMatch = true;
288 | }
289 | }
290 |
291 | if (!bFoundMatch) outputGR.Add(grData);
292 |
293 | }
294 | outputGR = outputGR.Distinct().ToList();
295 | grcd.RankRewards.RemoveAll(x => outputGR.Contains(x));
296 | io.Close();
297 |
298 |
299 | io = new IO(saveFile.FullName, Endian.Little, 0x0000000, FileMode.Truncate, FileAccess.ReadWrite, FileShare.ReadWrite);
300 | Helpers.WriteGVASSave(io, gvas);
301 | byte[] result;
302 | using (var stream = new MemoryStream())
303 | {
304 | Serializer.Serialize(stream, characterSave);
305 | result = stream.ToArray();
306 | }
307 | SaveBogoCrypt.Encrypt(result, 0, result.Length);
308 | io.WriteInt32(result.Length);
309 | io.WriteBytes(result);
310 |
311 | io.Close();
312 | }
313 |
314 | Console.WriteLine("Done injecting GR into saves");
315 | }
316 |
317 | #endregion
318 |
319 | #endregion
320 |
321 | #endregion
322 |
323 | #region Save Display Data
324 |
325 | public ObservableCollection GetGuardianRewards()
326 | {
327 | ObservableCollection pairs = new ObservableCollection();
328 | foreach (string humanName in DataPathTranslations.GuardianRankRewards.Values)
329 | {
330 | bool bUpdatedRankData = false;
331 | foreach (GuardianRankRewardSaveGameData rankData in loadedProfile.GuardianRank.RankRewards)
332 | {
333 | string h = DataPathTranslations.GetHumanRewardString(rankData.RewardDataPath);
334 | if (h.Equals(humanName))
335 | {
336 | Console.WriteLine("Rank Data ({0}): {1}", humanName, rankData.NumTokens);
337 | pairs.Add(new StringIntPair(humanName, rankData.NumTokens));
338 | bUpdatedRankData = true;
339 | break;
340 | }
341 | }
342 | if (!bUpdatedRankData)
343 | pairs.Add(new StringIntPair(humanName, 0));
344 | }
345 |
346 | return pairs;
347 | }
348 |
349 | public void UpdateSaveGUI()
350 | {
351 | UnspentTokensUp.IsEnabled = true;
352 |
353 | UnspentTokensUp.SetBinding(NumericUpDown.ValueProperty, new Binding("AvailableTokens") { Source = loadedProfile.GuardianRank });
354 | GuardianRank.SetBinding(NumericUpDown.ValueProperty, new Binding("GuardianRank") { Source = loadedProfile.GuardianRank });
355 |
356 | GuardianXP.SetBinding(NumericUpDown.ValueProperty, new Binding("NewGuardianExperience") { Source = loadedProfile.GuardianRank });
357 |
358 | GuardianRankDataGrid.ItemsSource = GetGuardianRewards();
359 |
360 | BankSDUs.SetBinding(NumericUpDown.ValueProperty, new Binding("SduLevel") { Source = loadedProfile.ProfileSduLists.Where(x => x.SduDataPath.Equals(DataPathTranslations.BankSDUAssetPath)) });
361 | LLSDUs.SetBinding(NumericUpDown.ValueProperty, new Binding("SduLevel") { Source = loadedProfile.ProfileSduLists.Where(x => x.SduDataPath.Equals(DataPathTranslations.LLSDUAssetPath)) });
362 | CSCurrency.SetBinding(NumericUpDown.ValueProperty, new Binding("CitizenScienceCSBucksAmount") { Source = loadedProfile });
363 |
364 | GoldenKeys.SetBinding(NumericUpDown.ValueProperty, new Binding("Quantity") { Source = loadedProfile.BankInventoryCategoryLists.Where(x => x.BaseCategoryDefinitionHash.Equals(DataPathTranslations.GoldenKeyHash)) } );
365 | }
366 |
367 | #endregion
368 |
369 | #endregion
370 |
371 | #region File Management / Editing
372 |
373 | private void LoadFileFromDisk()
374 | {
375 | Console.WriteLine("\n\nReading new file: \"{0}\"", filePath);
376 | IO io = new IO(filePath, Endian.Little, 0x0000000, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
377 | // We're gonna use this byte array for backing up the save file.
378 | originalBytes = io.ReadAll();
379 | io.Close();
380 | io = new IO(filePath, Endian.Little, 0x0000000, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
381 |
382 | saveData = Helpers.ReadGVASSave(io);
383 | if (saveData == null)
384 | {
385 | Console.WriteLine("Loaded file is not a BL3 profile...");
386 | showMessage("File Error", "Loaded file is not a BL3 profile");
387 | return;
388 | }
389 | string saveGameType = saveData.sgType;
390 |
391 | int remainingDataLength = io.ReadInt32();
392 | Console.WriteLine("Length of data: {0}", remainingDataLength);
393 | byte[] buf = io.ReadBytes(remainingDataLength);
394 | io.Close();
395 |
396 | if (!saveGameType.Equals("BP_DefaultOakProfile_C"))
397 | {
398 | Console.WriteLine("Loaded file is not a profile...");
399 | showMessage("File Error", "Loaded file is not a profile");
400 | return;
401 | }
402 |
403 | ProfileBogoCrypt.Decrypt(buf, 0, remainingDataLength);
404 | loadedProfile = Serializer.Deserialize(new MemoryStream(buf));
405 | UpdateSaveGUI();
406 | }
407 |
408 | private void SaveFileToDisk()
409 | {
410 | IO io = new IO(filePath, Endian.Little, 0x0000000, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
411 | File.WriteAllBytes(filePath + ".bak", originalBytes);
412 | ReadGUIData();
413 |
414 | Helpers.WriteGVASSave(io, saveData);
415 |
416 | byte[] result;
417 | using (var stream = new MemoryStream())
418 | {
419 | Serializer.Serialize(stream, loadedProfile);
420 | result = stream.ToArray();
421 | }
422 | ProfileBogoCrypt.Encrypt(result, 0, result.Length);
423 |
424 | io.WriteInt32(result.Length);
425 | io.WriteBytes(result);
426 |
427 | io.Close();
428 |
429 | Console.WriteLine("Injecting GR into saves...");
430 | GRInjection();
431 | }
432 |
433 | private void ReadGUIData()
434 | {
435 | foreach (StringIntPair p in GuardianRankDataGrid.Items)
436 | {
437 | string assetPath = DataPathTranslations.GetRewardAssetPathString(p.str);
438 | bool bRankDataSaved = false;
439 |
440 | foreach (GuardianRankRewardSaveGameData rankData in loadedProfile.GuardianRank.RankRewards)
441 | {
442 | if (rankData.RewardDataPath.Equals(assetPath))
443 | {
444 | rankData.NumTokens = (int)p.Value;
445 | bRankDataSaved = true;
446 | break;
447 | }
448 | }
449 |
450 | if (!bRankDataSaved)
451 | loadedProfile.GuardianRank.RankRewards.Add(new GuardianRankRewardSaveGameData() { RewardDataPath = assetPath, NumTokens = (int)p.Value });
452 |
453 | if (p.Value == 0)
454 | loadedProfile.GuardianRank.RankRewards.RemoveAll(x => x.RewardDataPath.Equals(assetPath));
455 | }
456 |
457 | loadedProfile.GuardianRank.GuardianExperience = (int)loadedProfile.GuardianRank.NewGuardianExperience;
458 |
459 | // If the save loaded previously never had any golden keys, the hashes won't be here... :/
460 | if(
461 | !loadedProfile.BankInventoryCategoryLists.Select(x => x.BaseCategoryDefinitionHash).Contains(DataPathTranslations.GoldenKeyHash) && GoldenKeys.Value != null) {
462 |
463 | loadedProfile.BankInventoryCategoryLists.Add(new InventoryCategorySaveData
464 | {
465 | BaseCategoryDefinitionHash = DataPathTranslations.GoldenKeyHash,
466 | Quantity = (int)GoldenKeys.Value
467 | });
468 | }
469 | }
470 |
471 |
472 | #endregion
473 |
474 | private async void MetroWindow_ContentRendered(object sender, EventArgs e)
475 | {
476 | try
477 | {
478 | Console.WriteLine("Requesting version information...");
479 | WebResponse rp = WebRequest.Create("https://raw.githubusercontent.com/FromDarkHell/BL3ProfileEditor/master/versionInformation.txt").GetResponse();
480 |
481 | string response = new StreamReader(rp.GetResponseStream()).ReadToEnd();
482 | Console.WriteLine("Server Response: {0}", response);
483 |
484 | Version v = new Version(response);
485 |
486 | Version assemblyVersion = new AssemblyName(Assembly.GetExecutingAssembly().FullName).Version;
487 |
488 | if (v.CompareTo(assemblyVersion) > 0) // Our server version is > our assembly version, meaning auto-update.
489 | {
490 | var mySettings = new MetroDialogSettings()
491 | {
492 | AffirmativeButtonText = "Update",
493 | NegativeButtonText = "Cancel",
494 | ColorScheme = MetroDialogColorScheme.Theme
495 | };
496 |
497 | MessageDialogResult result = await this.ShowMessageAsync("Update", "There's an update for the profile editor. Do you want to download it?",
498 | MessageDialogStyle.AffirmativeAndNegative, mySettings);
499 |
500 | if (result == MessageDialogResult.Affirmative)
501 | {
502 | System.Diagnostics.Process.Start("https://github.com/FromDarkHell/BL3ProfileEditor");
503 | Close();
504 | }
505 | }
506 | }
507 | catch
508 | {
509 | return;
510 | }
511 | }
512 | }
513 | }
514 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/PackageIO.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FromDarkHell/BL3ProfileEditor/8b27a4e695f950746e848cac4e23e280a48c0ef1/BL3ProfileEditor/PackageIO.dll
--------------------------------------------------------------------------------
/BL3ProfileEditor/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Resources;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
5 | using System.Windows;
6 |
7 | // General Information about an assembly is controlled through the following
8 | // set of attributes. Change these attribute values to modify the information
9 | // associated with an assembly.
10 | [assembly: AssemblyTitle("Borderlands 3 Profile Editor")]
11 | [assembly: AssemblyDescription("A profile editor for Borderlands 3")]
12 | [assembly: AssemblyConfiguration("")]
13 | [assembly: AssemblyCompany("FromDarkHell")]
14 | [assembly: AssemblyProduct("Borderlands 3 Profile Editor")]
15 | [assembly: AssemblyCopyright("Copyright © FromDarkHell 2020")]
16 | [assembly: AssemblyTrademark("")]
17 | [assembly: AssemblyCulture("")]
18 |
19 | // Setting ComVisible to false makes the types in this assembly not visible
20 | // to COM components. If you need to access a type in this assembly from
21 | // COM, set the ComVisible attribute to true on that type.
22 | [assembly: ComVisible(true)]
23 |
24 | //In order to begin building localizable applications, set
25 | //CultureYouAreCodingWith in your .csproj file
26 | //inside a . For example, if you are using US english
27 | //in your source files, set the to en-US. Then uncomment
28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in
29 | //the line below to match the UICulture setting in the project file.
30 |
31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32 |
33 |
34 | [assembly: ThemeInfo(
35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
36 | //(used if a resource is not found in the page,
37 | // or application resource dictionaries)
38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
39 | //(used if a resource is not found in the page,
40 | // app, or any theme specific resource dictionaries)
41 | )]
42 |
43 |
44 | // Version information for an assembly consists of the following four values:
45 | //
46 | // Major Version
47 | // Minor Version
48 | // Build Number
49 | // Revision
50 | //
51 | // You can specify all the values or you can default the Build and Revision Numbers
52 | // by using the '*' as shown below:
53 | // [assembly: AssemblyVersion("1.0.*")]
54 | [assembly: AssemblyVersion("1.2.6.0")]
55 | [assembly: AssemblyFileVersion("1.2.6.0")]
56 | [assembly: NeutralResourcesLanguage("en-US")]
57 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace BL3ProfileEditor.Properties
12 | {
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources
26 | {
27 |
28 | private static global::System.Resources.ResourceManager resourceMan;
29 |
30 | private static global::System.Globalization.CultureInfo resourceCulture;
31 |
32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
33 | internal Resources()
34 | {
35 | }
36 |
37 | ///
38 | /// Returns the cached ResourceManager instance used by this class.
39 | ///
40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
41 | internal static global::System.Resources.ResourceManager ResourceManager
42 | {
43 | get
44 | {
45 | if ((resourceMan == null))
46 | {
47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BL3ProfileEditor.Properties.Resources", typeof(Resources).Assembly);
48 | resourceMan = temp;
49 | }
50 | return resourceMan;
51 | }
52 | }
53 |
54 | ///
55 | /// Overrides the current thread's CurrentUICulture property for all
56 | /// resource lookups using this strongly typed resource class.
57 | ///
58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
59 | internal static global::System.Globalization.CultureInfo Culture
60 | {
61 | get
62 | {
63 | return resourceCulture;
64 | }
65 | set
66 | {
67 | resourceCulture = value;
68 | }
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "profiles": {
3 | "BL3ProfileEditor": {
4 | "commandName": "Project"
5 | }
6 | }
7 | }
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/Decryption/CRC32.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Globalization;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace BL3ProfileEditor.Protobufs.Decryption
9 | {
10 | ///
11 | /// Performs 32-bit reversed cyclic redundancy checks.
12 | ///
13 | class CRC32
14 | {
15 | #region Fields
16 | ///
17 | /// Contains a cache of calculated checksum chunks.
18 | ///
19 | private static readonly uint[] checksumTable = {
20 | 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,
21 | 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD,
22 | 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9, 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75,
23 | 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011, 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD,
24 | 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039, 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5,
25 | 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81, 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,
26 | 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49, 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95,
27 | 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1, 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D,
28 | 0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE, 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072,
29 | 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16, 0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA,
30 | 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE, 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02,
31 | 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066, 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,
32 | 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692,
33 | 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6, 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A,
34 | 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E, 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2,
35 | 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A,
36 | 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637, 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB,
37 | 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F, 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,
38 | 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47, 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B,
39 | 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF, 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623,
40 | 0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7, 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B,
41 | 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F, 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3,
42 | 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7, 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B,
43 | 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F, 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,
44 | 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640, 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C,
45 | 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8, 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24,
46 | 0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30, 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,
47 | 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654,
48 | 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0, 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C,
49 | 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18, 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,
50 | 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0, 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C,
51 | 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4,
52 | };
53 |
54 | #endregion
55 |
56 | #region Methods
57 |
58 | public static uint Get(string assetPath)
59 | {
60 | uint hash = 0x00;
61 | foreach (char c in assetPath.ToCharArray())
62 | {
63 | char uc = char.ToUpper(c, CultureInfo.InvariantCulture);
64 | hash = checksumTable[(byte)(hash ^ (uc >> 0))] ^ (hash >> 8);
65 | hash = checksumTable[(byte)(hash ^ (uc >> 8))] ^ (hash >> 8);
66 | }
67 | return hash;
68 | }
69 | #endregion
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/Decryption/ProfileBogoCrypt.cs:
--------------------------------------------------------------------------------
1 | /* Copyright (c) 2019 Rick (rick 'at' gibbed 'dot' us)
2 | *
3 | * This software is provided 'as-is', without any express or implied
4 | * warranty. In no event will the authors be held liable for any damages
5 | * arising from the use of this software.
6 | *
7 | * Permission is granted to anyone to use this software for any purpose,
8 | * including commercial applications, and to alter it and redistribute it
9 | * freely, subject to the following restrictions:
10 | *
11 | * 1. The origin of this software must not be misrepresented; you must not
12 | * claim that you wrote the original software. If you use this software
13 | * in a product, an acknowledgment in the product documentation would
14 | * be appreciated but is not required.
15 | *
16 | * 2. Altered source versions must be plainly marked as such, and must not
17 | * be misrepresented as being the original software.
18 | *
19 | * 3. This notice may not be removed or altered from any source
20 | * distribution.
21 | */
22 |
23 | using System;
24 |
25 | namespace Gibbed.Borderlands3.ProfileFormats
26 | {
27 | internal static class ProfileBogoCrypt
28 | {
29 | private static readonly byte[] _PrefixMagic;
30 | private static readonly byte[] _XorMagic;
31 |
32 | static ProfileBogoCrypt()
33 | {
34 | _PrefixMagic = new byte[]
35 | {
36 | 0xD8, 0x04, 0xB9, 0x08, 0x5C, 0x4E, 0x2B, 0xC0,
37 | 0x61, 0x9F, 0x7C, 0x8D, 0x5D, 0x34, 0x00, 0x56,
38 | 0xE7, 0x7B, 0x4E, 0xC0, 0xA4, 0xD6, 0xA7, 0x01,
39 | 0x14, 0x15, 0xA9, 0x93, 0x1F, 0x27, 0x2C, 0x8F,
40 | };
41 | _XorMagic = new byte[]
42 | {
43 | 0xE8, 0xDC, 0x3A, 0x66, 0xF7, 0xEF, 0x85, 0xE0,
44 | 0xBD, 0x4A, 0xA9, 0x73, 0x57, 0x99, 0x30, 0x8C,
45 | 0x94, 0x63, 0x59, 0xA8, 0xC9, 0xAE, 0xD9, 0x58,
46 | 0x7D, 0x51, 0xB0, 0x1E, 0xBE, 0xD0, 0x77, 0x43,
47 | };
48 | }
49 |
50 | public static void Encrypt(byte[] buffer, int offset, int length)
51 | {
52 | if (buffer == null)
53 | {
54 | throw new ArgumentNullException(nameof(buffer));
55 | }
56 |
57 | if (offset < 0)
58 | {
59 | throw new ArgumentOutOfRangeException(nameof(offset));
60 | }
61 |
62 | if (length < 0)
63 | {
64 | throw new ArgumentOutOfRangeException(nameof(length));
65 | }
66 |
67 | if (offset > buffer.Length)
68 | {
69 | throw new ArgumentOutOfRangeException(nameof(offset));
70 | }
71 |
72 | if (offset + length > buffer.Length)
73 | {
74 | throw new ArgumentOutOfRangeException(nameof(length));
75 | }
76 |
77 | if (length == 0)
78 | {
79 | return;
80 | }
81 |
82 | for (int i = 0, o = offset; i < length; i++, o++)
83 | {
84 | byte b = i < 32 ? _PrefixMagic[i] : buffer[o - 32];
85 | b ^= _XorMagic[o % 32];
86 | buffer[o] ^= b;
87 | }
88 | }
89 |
90 | public static void Decrypt(byte[] buffer, int offset, int length)
91 | {
92 | if (buffer == null)
93 | {
94 | throw new ArgumentNullException(nameof(buffer));
95 | }
96 |
97 | if (offset < 0)
98 | {
99 | throw new ArgumentOutOfRangeException(nameof(offset));
100 | }
101 |
102 | if (length < 0)
103 | {
104 | throw new ArgumentOutOfRangeException(nameof(length));
105 | }
106 |
107 | if (offset > buffer.Length)
108 | {
109 | throw new ArgumentOutOfRangeException(nameof(offset));
110 | }
111 |
112 | if (offset + length > buffer.Length)
113 | {
114 | throw new ArgumentOutOfRangeException(nameof(length));
115 | }
116 |
117 | if (length == 0)
118 | {
119 | return;
120 | }
121 |
122 | for (int i = length - 1, o = offset + i; i >= 0; i--, o--)
123 | {
124 | byte b = i < 32 ? _PrefixMagic[i] : buffer[o - 32];
125 | b ^= _XorMagic[o % 32];
126 | buffer[o] ^= b;
127 | }
128 | }
129 | }
130 | }
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/Decryption/SaveBogoCrypt.cs:
--------------------------------------------------------------------------------
1 | /* Copyright (c) 2019 Rick (rick 'at' gibbed 'dot' us)
2 | *
3 | * This software is provided 'as-is', without any express or implied
4 | * warranty. In no event will the authors be held liable for any damages
5 | * arising from the use of this software.
6 | *
7 | * Permission is granted to anyone to use this software for any purpose,
8 | * including commercial applications, and to alter it and redistribute it
9 | * freely, subject to the following restrictions:
10 | *
11 | * 1. The origin of this software must not be misrepresented; you must not
12 | * claim that you wrote the original software. If you use this software
13 | * in a product, an acknowledgment in the product documentation would
14 | * be appreciated but is not required.
15 | *
16 | * 2. Altered source versions must be plainly marked as such, and must not
17 | * be misrepresented as being the original software.
18 | *
19 | * 3. This notice may not be removed or altered from any source
20 | * distribution.
21 | */
22 |
23 | using System;
24 |
25 | namespace Gibbed.Borderlands3.SaveFormats
26 | {
27 | internal static class SaveBogoCrypt
28 | {
29 | private static readonly byte[] _PrefixMagic;
30 | private static readonly byte[] _XorMagic;
31 |
32 | static SaveBogoCrypt()
33 | {
34 | _PrefixMagic = new byte[]
35 | {
36 | 0x71, 0x34, 0x36, 0xB3, 0x56, 0x63, 0x25, 0x5F,
37 | 0xEA, 0xE2, 0x83, 0x73, 0xF4, 0x98, 0xB8, 0x18,
38 | 0x2E, 0xE5, 0x42, 0x2E, 0x50, 0xA2, 0x0F, 0x49,
39 | 0x87, 0x24, 0xE6, 0x65, 0x9A, 0xF0, 0x7C, 0xD7,
40 | };
41 | _XorMagic = new byte[]
42 | {
43 | 0x7C, 0x07, 0x69, 0x83, 0x31, 0x7E, 0x0C, 0x82,
44 | 0x5F, 0x2E, 0x36, 0x7F, 0x76, 0xB4, 0xA2, 0x71,
45 | 0x38, 0x2B, 0x6E, 0x87, 0x39, 0x05, 0x02, 0xC6,
46 | 0xCD, 0xD8, 0xB1, 0xCC, 0xA1, 0x33, 0xF9, 0xB6,
47 | };
48 | }
49 |
50 | public static void Encrypt(byte[] buffer, int offset, int length)
51 | {
52 | if (buffer == null)
53 | {
54 | throw new ArgumentNullException(nameof(buffer));
55 | }
56 |
57 | if (offset < 0)
58 | {
59 | throw new ArgumentOutOfRangeException(nameof(offset));
60 | }
61 |
62 | if (length < 0)
63 | {
64 | throw new ArgumentOutOfRangeException(nameof(length));
65 | }
66 |
67 | if (offset > buffer.Length)
68 | {
69 | throw new ArgumentOutOfRangeException(nameof(offset));
70 | }
71 |
72 | if (offset + length > buffer.Length)
73 | {
74 | throw new ArgumentOutOfRangeException(nameof(length));
75 | }
76 |
77 | if (length == 0)
78 | {
79 | return;
80 | }
81 |
82 | for (int i = 0, o = offset; i < length; i++, o++)
83 | {
84 | byte b = i < 32 ? _PrefixMagic[i] : buffer[o - 32];
85 | b ^= _XorMagic[o % 32];
86 | buffer[o] ^= b;
87 | }
88 | }
89 |
90 | public static void Decrypt(byte[] buffer, int offset, int length)
91 | {
92 | if (buffer == null)
93 | {
94 | throw new ArgumentNullException(nameof(buffer));
95 | }
96 |
97 | if (offset < 0)
98 | {
99 | throw new ArgumentOutOfRangeException(nameof(offset));
100 | }
101 |
102 | if (length < 0)
103 | {
104 | throw new ArgumentOutOfRangeException(nameof(length));
105 | }
106 |
107 | if (offset > buffer.Length)
108 | {
109 | throw new ArgumentOutOfRangeException(nameof(offset));
110 | }
111 |
112 | if (offset + length > buffer.Length)
113 | {
114 | throw new ArgumentOutOfRangeException(nameof(length));
115 | }
116 |
117 | if (length == 0)
118 | {
119 | return;
120 | }
121 |
122 | for (int i = length - 1, o = offset + i; i >= 0; i--, o--)
123 | {
124 | byte b = i < 32 ? _PrefixMagic[i] : buffer[o - 32];
125 | b ^= _XorMagic[o % 32];
126 | buffer[o] ^= b;
127 | }
128 | }
129 | }
130 | }
131 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/Definitions/OakProfile.cs:
--------------------------------------------------------------------------------
1 | // This file was generated by a tool; you should avoid making direct changes.
2 | // Consider using 'partial classes' to extend these types
3 | // Input: OakProfile.proto
4 |
5 | #pragma warning disable CS0612, CS1591, CS3021, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
6 | namespace OakSave
7 | {
8 |
9 | [global::ProtoBuf.ProtoContract(Name = @"PlayerInputBinding_Button")]
10 | public partial class PlayerInputBindingButton : global::ProtoBuf.IExtensible
11 | {
12 | private global::ProtoBuf.IExtension __pbn__extensionData;
13 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
14 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
15 |
16 | [global::ProtoBuf.ProtoMember(1, Name = @"rebind_data_path")]
17 | [global::System.ComponentModel.DefaultValue("")]
18 | public string RebindDataPath { get; set; } = "";
19 |
20 | [global::ProtoBuf.ProtoMember(2, Name = @"key_names")]
21 | public global::System.Collections.Generic.List KeyNames { get; } = new global::System.Collections.Generic.List();
22 |
23 | }
24 |
25 | [global::ProtoBuf.ProtoContract(Name = @"PlayerInputBinding_Axis_Key")]
26 | public partial class PlayerInputBindingAxisKey : global::ProtoBuf.IExtensible
27 | {
28 | private global::ProtoBuf.IExtension __pbn__extensionData;
29 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
30 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
31 |
32 | [global::ProtoBuf.ProtoMember(1, Name = @"key_name")]
33 | [global::System.ComponentModel.DefaultValue("")]
34 | public string KeyName { get; set; } = "";
35 |
36 | [global::ProtoBuf.ProtoMember(2, Name = @"scale_3d")]
37 | public Vec3 Scale3d { get; set; }
38 |
39 | }
40 |
41 | [global::ProtoBuf.ProtoContract(Name = @"PlayerInputBinding_Axis")]
42 | public partial class PlayerInputBindingAxis : global::ProtoBuf.IExtensible
43 | {
44 | private global::ProtoBuf.IExtension __pbn__extensionData;
45 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
46 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
47 |
48 | [global::ProtoBuf.ProtoMember(1, Name = @"rebind_data_path")]
49 | [global::System.ComponentModel.DefaultValue("")]
50 | public string RebindDataPath { get; set; } = "";
51 |
52 | [global::ProtoBuf.ProtoMember(2, Name = @"keys")]
53 | public global::System.Collections.Generic.List Keys { get; } = new global::System.Collections.Generic.List();
54 |
55 | }
56 |
57 | [global::ProtoBuf.ProtoContract(Name = @"PlayerInputBinding_Category")]
58 | public partial class PlayerInputBindingCategory : global::ProtoBuf.IExtensible
59 | {
60 | private global::ProtoBuf.IExtension __pbn__extensionData;
61 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
62 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
63 |
64 | [global::ProtoBuf.ProtoMember(1, Name = @"category_data_path")]
65 | [global::System.ComponentModel.DefaultValue("")]
66 | public string CategoryDataPath { get; set; } = "";
67 |
68 | [global::ProtoBuf.ProtoMember(2, Name = @"context_data_path")]
69 | [global::System.ComponentModel.DefaultValue("")]
70 | public string ContextDataPath { get; set; } = "";
71 |
72 | [global::ProtoBuf.ProtoMember(3, Name = @"button_bindings")]
73 | public global::System.Collections.Generic.List ButtonBindings { get; } = new global::System.Collections.Generic.List();
74 |
75 | [global::ProtoBuf.ProtoMember(4, Name = @"axis_bindings")]
76 | public global::System.Collections.Generic.List AxisBindings { get; } = new global::System.Collections.Generic.List();
77 |
78 | }
79 |
80 | [global::ProtoBuf.ProtoContract()]
81 | public partial class PlayerInputBindings : global::ProtoBuf.IExtensible
82 | {
83 | private global::ProtoBuf.IExtension __pbn__extensionData;
84 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
85 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
86 |
87 | [global::ProtoBuf.ProtoMember(1, Name = @"categories")]
88 | public global::System.Collections.Generic.List Categories { get; } = new global::System.Collections.Generic.List();
89 |
90 | }
91 |
92 | [global::ProtoBuf.ProtoContract()]
93 | public partial class OakProfileLastInventoryFilterInfo : global::ProtoBuf.IExtensible
94 | {
95 | private global::ProtoBuf.IExtension __pbn__extensionData;
96 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
97 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
98 |
99 | [global::ProtoBuf.ProtoMember(1, Name = @"slot_type_id")]
100 | [global::System.ComponentModel.DefaultValue("")]
101 | public string SlotTypeId { get; set; } = "";
102 |
103 | [global::ProtoBuf.ProtoMember(2, Name = @"last_filter_index")]
104 | public int LastFilterIndex { get; set; }
105 |
106 | }
107 |
108 | [global::ProtoBuf.ProtoContract()]
109 | public partial class OakProfileMenuTutorialInfo : global::ProtoBuf.IExtensible
110 | {
111 | private global::ProtoBuf.IExtension __pbn__extensionData;
112 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
113 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
114 |
115 | [global::ProtoBuf.ProtoMember(1, Name = @"seen_tutorials")]
116 | public global::System.Collections.Generic.List SeenTutorials { get; } = new global::System.Collections.Generic.List();
117 |
118 | [global::ProtoBuf.ProtoMember(2, Name = @"tutorials_disabled")]
119 | public bool TutorialsDisabled { get; set; }
120 |
121 | [global::ProtoBuf.ProtoMember(3, Name = @"tutorials_allowed_in_non_game_modes")]
122 | public bool TutorialsAllowedInNonGameModes { get; set; }
123 |
124 | }
125 |
126 | [global::ProtoBuf.ProtoContract()]
127 | public partial class OakFriendEncounterData : global::ProtoBuf.IExtensible
128 | {
129 | private global::ProtoBuf.IExtension __pbn__extensionData;
130 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
131 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
132 |
133 | [global::ProtoBuf.ProtoMember(1, Name = @"num_encounters")]
134 | public uint NumEncounters { get; set; }
135 |
136 | [global::ProtoBuf.ProtoMember(2, Name = @"time_last_encounter")]
137 | public long TimeLastEncounter { get; set; }
138 |
139 | }
140 |
141 | [global::ProtoBuf.ProtoContract()]
142 | public partial class OakMailItem : global::ProtoBuf.IExtensible
143 | {
144 | private global::ProtoBuf.IExtension __pbn__extensionData;
145 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
146 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
147 |
148 | [global::ProtoBuf.ProtoMember(1, Name = @"mail_item_type")]
149 | public uint MailItemType { get; set; }
150 |
151 | [global::ProtoBuf.ProtoMember(2, Name = @"sender_display_name")]
152 | [global::System.ComponentModel.DefaultValue("")]
153 | public string SenderDisplayName { get; set; } = "";
154 |
155 | [global::ProtoBuf.ProtoMember(3, Name = @"subject")]
156 | [global::System.ComponentModel.DefaultValue("")]
157 | public string Subject { get; set; } = "";
158 |
159 | [global::ProtoBuf.ProtoMember(4, Name = @"body")]
160 | [global::System.ComponentModel.DefaultValue("")]
161 | public string Body { get; set; } = "";
162 |
163 | [global::ProtoBuf.ProtoMember(5, Name = @"gear_serial_number")]
164 | [global::System.ComponentModel.DefaultValue("")]
165 | public string GearSerialNumber { get; set; } = "";
166 |
167 | [global::ProtoBuf.ProtoMember(6, Name = @"mail_guid")]
168 | [global::System.ComponentModel.DefaultValue("")]
169 | public string MailGuid { get; set; } = "";
170 |
171 | [global::ProtoBuf.ProtoMember(7, Name = @"date_sent")]
172 | public long DateSent { get; set; }
173 |
174 | [global::ProtoBuf.ProtoMember(8, Name = @"expiration_date")]
175 | public long ExpirationDate { get; set; }
176 |
177 | [global::ProtoBuf.ProtoMember(9, Name = @"from_player_id")]
178 | [global::System.ComponentModel.DefaultValue("")]
179 | public string FromPlayerId { get; set; } = "";
180 |
181 | [global::ProtoBuf.ProtoMember(10, Name = @"has_been_read")]
182 | public bool HasBeenRead { get; set; }
183 |
184 | }
185 |
186 | [global::ProtoBuf.ProtoContract()]
187 | public partial class GearSoldByFriendData : global::ProtoBuf.IExtensible
188 | {
189 | private global::ProtoBuf.IExtension __pbn__extensionData;
190 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
191 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
192 |
193 | [global::ProtoBuf.ProtoMember(1, Name = @"gear_serial_number")]
194 | [global::System.ComponentModel.DefaultValue("")]
195 | public string GearSerialNumber { get; set; } = "";
196 |
197 | [global::ProtoBuf.ProtoMember(2, Name = @"player_class_identifier_hash")]
198 | public int PlayerClassIdentifierHash { get; set; }
199 |
200 | [global::ProtoBuf.ProtoMember(3, Name = @"friend_net_id")]
201 | [global::System.ComponentModel.DefaultValue("")]
202 | public string FriendNetId { get; set; } = "";
203 |
204 | }
205 |
206 | [global::ProtoBuf.ProtoContract()]
207 | public partial class OakCustomizationSaveGameData : global::ProtoBuf.IExtensible
208 | {
209 | private global::ProtoBuf.IExtension __pbn__extensionData;
210 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
211 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
212 |
213 | [global::ProtoBuf.ProtoMember(1, Name = @"is_new")]
214 | public bool IsNew { get; set; }
215 |
216 | [global::ProtoBuf.ProtoMember(2, Name = @"customization_asset_path")]
217 | [global::System.ComponentModel.DefaultValue("")]
218 | public string CustomizationAssetPath { get; set; } = "";
219 |
220 | }
221 |
222 | [global::ProtoBuf.ProtoContract()]
223 | public partial class OakInventoryCustomizationPartInfo : global::ProtoBuf.IExtensible
224 | {
225 | private global::ProtoBuf.IExtension __pbn__extensionData;
226 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
227 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
228 |
229 | [global::ProtoBuf.ProtoMember(1, Name = @"customization_part_hash")]
230 | public uint CustomizationPartHash { get; set; }
231 |
232 | [global::ProtoBuf.ProtoMember(2, Name = @"is_new")]
233 | public bool IsNew { get; set; }
234 |
235 | }
236 |
237 | [global::ProtoBuf.ProtoContract()]
238 | public partial class GuardianRankRewardSaveGameData : global::ProtoBuf.IExtensible
239 | {
240 | private global::ProtoBuf.IExtension __pbn__extensionData;
241 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
242 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
243 |
244 | [global::ProtoBuf.ProtoMember(1, Name = @"num_tokens")]
245 | public int NumTokens { get; set; }
246 |
247 | [global::ProtoBuf.ProtoMember(2, Name = @"reward_data_path")]
248 | [global::System.ComponentModel.DefaultValue("")]
249 | public string RewardDataPath { get; set; } = "";
250 |
251 | }
252 |
253 | [global::ProtoBuf.ProtoContract()]
254 | public partial class GuardianRankProfileData : global::ProtoBuf.IExtensible
255 | {
256 | private global::ProtoBuf.IExtension __pbn__extensionData;
257 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
258 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
259 |
260 | [global::ProtoBuf.ProtoMember(1, Name = @"available_tokens")]
261 | public int AvailableTokens { get; set; }
262 |
263 | [global::ProtoBuf.ProtoMember(2, Name = @"rank_rewards")]
264 | public global::System.Collections.Generic.List RankRewards { get; } = new global::System.Collections.Generic.List();
265 |
266 | [global::ProtoBuf.ProtoMember(3, Name = @"guardian_rank")]
267 | public int GuardianRank { get; set; }
268 |
269 | [global::ProtoBuf.ProtoMember(4, Name = @"guardian_experience")]
270 | public int GuardianExperience { get; set; }
271 |
272 | [global::ProtoBuf.ProtoMember(5, Name = @"guardian_reward_random_seed")]
273 | public int GuardianRewardRandomSeed { get; set; }
274 |
275 | [global::ProtoBuf.ProtoMember(6, Name = @"new_guardian_experience")]
276 | public long NewGuardianExperience { get; set; }
277 |
278 | }
279 |
280 | [global::ProtoBuf.ProtoContract()]
281 | public partial class CrewQuartersDecorationItemSaveGameData : global::ProtoBuf.IExtensible
282 | {
283 | private global::ProtoBuf.IExtension __pbn__extensionData;
284 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
285 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
286 |
287 | [global::ProtoBuf.ProtoMember(1, Name = @"is_new")]
288 | public bool IsNew { get; set; }
289 |
290 | [global::ProtoBuf.ProtoMember(2, Name = @"decoration_item_asset_path")]
291 | [global::System.ComponentModel.DefaultValue("")]
292 | public string DecorationItemAssetPath { get; set; } = "";
293 |
294 | }
295 |
296 | [global::ProtoBuf.ProtoContract()]
297 | public partial class CrewQuartersRoomItemSaveGameData : global::ProtoBuf.IExtensible
298 | {
299 | private global::ProtoBuf.IExtension __pbn__extensionData;
300 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
301 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
302 |
303 | [global::ProtoBuf.ProtoMember(1, Name = @"is_new")]
304 | public bool IsNew { get; set; }
305 |
306 | [global::ProtoBuf.ProtoMember(2, Name = @"room_item_asset_path")]
307 | [global::System.ComponentModel.DefaultValue("")]
308 | public string RoomItemAssetPath { get; set; } = "";
309 |
310 | }
311 |
312 | [global::ProtoBuf.ProtoContract()]
313 | public partial class RecentlyMetPlayer : global::ProtoBuf.IExtensible
314 | {
315 | private global::ProtoBuf.IExtension __pbn__extensionData;
316 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
317 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
318 |
319 | [global::ProtoBuf.ProtoMember(1, Name = @"shift_player_id")]
320 | [global::System.ComponentModel.DefaultValue("")]
321 | public string ShiftPlayerId { get; set; } = "";
322 |
323 | [global::ProtoBuf.ProtoMember(2, Name = @"first_party_player_id")]
324 | [global::System.ComponentModel.DefaultValue("")]
325 | public string FirstPartyPlayerId { get; set; } = "";
326 |
327 | [global::ProtoBuf.ProtoMember(3, Name = @"show_shift_player_entry")]
328 | public bool ShowShiftPlayerEntry { get; set; }
329 |
330 | }
331 |
332 | [global::ProtoBuf.ProtoContract()]
333 | public partial class Profile : global::ProtoBuf.IExtensible
334 | {
335 | private global::ProtoBuf.IExtension __pbn__extensionData;
336 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
337 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
338 |
339 | [global::ProtoBuf.ProtoMember(1, Name = @"enable_aim_assist")]
340 | public bool EnableAimAssist { get; set; }
341 |
342 | [global::ProtoBuf.ProtoMember(2, Name = @"gamepad_invert_look")]
343 | public bool GamepadInvertLook { get; set; }
344 |
345 | [global::ProtoBuf.ProtoMember(3, Name = @"gamepad_invert_turn")]
346 | public bool GamepadInvertTurn { get; set; }
347 |
348 | [global::ProtoBuf.ProtoMember(4, Name = @"gamepad_invert_move")]
349 | public bool GamepadInvertMove { get; set; }
350 |
351 | [global::ProtoBuf.ProtoMember(5, Name = @"gamepad_invert_strafe")]
352 | public bool GamepadInvertStrafe { get; set; }
353 |
354 | [global::ProtoBuf.ProtoMember(6, Name = @"enable_vibration")]
355 | public bool EnableVibration { get; set; }
356 |
357 | [global::ProtoBuf.ProtoMember(7, Name = @"invert_mouse_pitch")]
358 | public bool InvertMousePitch { get; set; }
359 |
360 | [global::ProtoBuf.ProtoMember(8, Name = @"enable_mouse_smoothing")]
361 | public bool EnableMouseSmoothing { get; set; }
362 |
363 | [global::ProtoBuf.ProtoMember(9, Name = @"mouse_scale")]
364 | public float MouseScale { get; set; }
365 |
366 | [global::ProtoBuf.ProtoMember(10, Name = @"show_damage_numbers")]
367 | public bool ShowDamageNumbers { get; set; }
368 |
369 | [global::ProtoBuf.ProtoMember(11, Name = @"show_damage_number_icons")]
370 | public bool ShowDamageNumberIcons { get; set; }
371 |
372 | [global::ProtoBuf.ProtoMember(12, Name = @"enable_training_messages")]
373 | public bool EnableTrainingMessages { get; set; }
374 |
375 | [global::ProtoBuf.ProtoMember(13, Name = @"show_text_chat")]
376 | public bool ShowTextChat { get; set; }
377 |
378 | [global::ProtoBuf.ProtoMember(14, Name = @"center_crosshair")]
379 | public bool CenterCrosshair { get; set; }
380 |
381 | [global::ProtoBuf.ProtoMember(15, Name = @"toggle_sprint")]
382 | public bool ToggleSprint { get; set; }
383 |
384 | [global::ProtoBuf.ProtoMember(16, Name = @"toggle_crouch")]
385 | public bool ToggleCrouch { get; set; }
386 |
387 | [global::ProtoBuf.ProtoMember(17, Name = @"censor_content")]
388 | public bool CensorContent { get; set; }
389 |
390 | [global::ProtoBuf.ProtoMember(18, Name = @"music_volume")]
391 | public float MusicVolume { get; set; }
392 |
393 | [global::ProtoBuf.ProtoMember(19, Name = @"sound_effects_volume")]
394 | public float SoundEffectsVolume { get; set; }
395 |
396 | [global::ProtoBuf.ProtoMember(20, Name = @"vo_volume")]
397 | public float VoVolume { get; set; }
398 |
399 | [global::ProtoBuf.ProtoMember(21, Name = @"voice_volume")]
400 | public float VoiceVolume { get; set; }
401 |
402 | [global::ProtoBuf.ProtoMember(22, Name = @"enable_optional_vo")]
403 | public bool EnableOptionalVo { get; set; }
404 |
405 | [global::ProtoBuf.ProtoMember(23, Name = @"push_to_talk")]
406 | public bool PushToTalk { get; set; }
407 |
408 | [global::ProtoBuf.ProtoMember(24, Name = @"enable_controller_audio")]
409 | public bool EnableControllerAudio { get; set; }
410 |
411 | [global::ProtoBuf.ProtoMember(25, Name = @"speaker_angle_front")]
412 | public float SpeakerAngleFront { get; set; }
413 |
414 | [global::ProtoBuf.ProtoMember(26, Name = @"speaker_angle_side")]
415 | public float SpeakerAngleSide { get; set; }
416 |
417 | [global::ProtoBuf.ProtoMember(27, Name = @"speaker_angle_back")]
418 | public float SpeakerAngleBack { get; set; }
419 |
420 | [global::ProtoBuf.ProtoMember(28, Name = @"speaker_setup")]
421 | public uint SpeakerSetup { get; set; }
422 |
423 | [global::ProtoBuf.ProtoMember(29, Name = @"mute_audio_on_focus_loss")]
424 | public bool MuteAudioOnFocusLoss { get; set; }
425 |
426 | [global::ProtoBuf.ProtoMember(34, Name = @"hide_strict_nat_help_dialog")]
427 | public bool HideStrictNatHelpDialog { get; set; }
428 |
429 | [global::ProtoBuf.ProtoMember(35, Name = @"player_input_bindings")]
430 | public PlayerInputBindings PlayerInputBindings { get; set; }
431 |
432 | [global::ProtoBuf.ProtoMember(36, Name = @"news_hashes", IsPacked = true)]
433 | public uint[] NewsHashes { get; set; }
434 |
435 | [global::ProtoBuf.ProtoMember(37, Name = @"last_used_savegame_id")]
436 | public uint LastUsedSavegameId { get; set; }
437 |
438 | [global::ProtoBuf.ProtoMember(38, Name = @"gamepad_hip_sensitivity_level")]
439 | public int GamepadHipSensitivityLevel { get; set; }
440 |
441 | [global::ProtoBuf.ProtoMember(39, Name = @"gamepad_zoomed_sensitivity_level")]
442 | public int GamepadZoomedSensitivityLevel { get; set; }
443 |
444 | [global::ProtoBuf.ProtoMember(40, Name = @"gamepad_vehicle_sensitivity_level")]
445 | public int GamepadVehicleSensitivityLevel { get; set; }
446 |
447 | [global::ProtoBuf.ProtoMember(41, Name = @"gamepad_movement_dead_zone_x")]
448 | public float GamepadMovementDeadZoneX { get; set; }
449 |
450 | [global::ProtoBuf.ProtoMember(42, Name = @"gamepad_movement_dead_zone_y")]
451 | public float GamepadMovementDeadZoneY { get; set; }
452 |
453 | [global::ProtoBuf.ProtoMember(43, Name = @"gamepad_look_dead_zone_inner_x")]
454 | public float GamepadLookDeadZoneInnerX { get; set; }
455 |
456 | [global::ProtoBuf.ProtoMember(44, Name = @"gamepad_look_dead_zone_outer_x")]
457 | public float GamepadLookDeadZoneOuterX { get; set; }
458 |
459 | [global::ProtoBuf.ProtoMember(45, Name = @"gamepad_look_dead_zone_inner_y")]
460 | public float GamepadLookDeadZoneInnerY { get; set; }
461 |
462 | [global::ProtoBuf.ProtoMember(46, Name = @"gamepad_look_dead_zone_outer_y")]
463 | public float GamepadLookDeadZoneOuterY { get; set; }
464 |
465 | [global::ProtoBuf.ProtoMember(47, Name = @"gamepad_vehicle_movement_dead_zone_x")]
466 | public float GamepadVehicleMovementDeadZoneX { get; set; }
467 |
468 | [global::ProtoBuf.ProtoMember(48, Name = @"gamepad_vehicle_movement_dead_zone_y")]
469 | public float GamepadVehicleMovementDeadZoneY { get; set; }
470 |
471 | [global::ProtoBuf.ProtoMember(49, Name = @"gamepad_vehicle_look_dead_zone_inner_x")]
472 | public float GamepadVehicleLookDeadZoneInnerX { get; set; }
473 |
474 | [global::ProtoBuf.ProtoMember(50, Name = @"gamepad_vehicle_look_dead_zone_outer_x")]
475 | public float GamepadVehicleLookDeadZoneOuterX { get; set; }
476 |
477 | [global::ProtoBuf.ProtoMember(51, Name = @"gamepad_vehicle_look_dead_zone_inner_y")]
478 | public float GamepadVehicleLookDeadZoneInnerY { get; set; }
479 |
480 | [global::ProtoBuf.ProtoMember(52, Name = @"gamepad_vehicle_look_dead_zone_outer_y")]
481 | public float GamepadVehicleLookDeadZoneOuterY { get; set; }
482 |
483 | [global::ProtoBuf.ProtoMember(53, Name = @"gamepad_left_dead_zone_inner")]
484 | public float GamepadLeftDeadZoneInner { get; set; }
485 |
486 | [global::ProtoBuf.ProtoMember(54, Name = @"gamepad_left_dead_zone_outer")]
487 | public float GamepadLeftDeadZoneOuter { get; set; }
488 |
489 | [global::ProtoBuf.ProtoMember(55, Name = @"gamepad_right_dead_zone_inner")]
490 | public float GamepadRightDeadZoneInner { get; set; }
491 |
492 | [global::ProtoBuf.ProtoMember(56, Name = @"gamepad_right_dead_zone_outer")]
493 | public float GamepadRightDeadZoneOuter { get; set; }
494 |
495 | [global::ProtoBuf.ProtoMember(57, Name = @"gamepad_look_axial_dead_zone_scale")]
496 | public float GamepadLookAxialDeadZoneScale { get; set; }
497 |
498 | [global::ProtoBuf.ProtoMember(58, Name = @"gamepad_move_axial_dead_zone_scale")]
499 | public float GamepadMoveAxialDeadZoneScale { get; set; }
500 |
501 | [global::ProtoBuf.ProtoMember(59, Name = @"gamepad_use_advanced_hip_aim_settings")]
502 | public bool GamepadUseAdvancedHipAimSettings { get; set; }
503 |
504 | [global::ProtoBuf.ProtoMember(60, Name = @"gamepad_use_advanced_zoomed_aim_settings")]
505 | public bool GamepadUseAdvancedZoomedAimSettings { get; set; }
506 |
507 | [global::ProtoBuf.ProtoMember(61, Name = @"gamepad_use_advanced_vehicle_aim_settings")]
508 | public bool GamepadUseAdvancedVehicleAimSettings { get; set; }
509 |
510 | [global::ProtoBuf.ProtoMember(62, Name = @"gamepad_hip_yaw_rate")]
511 | public float GamepadHipYawRate { get; set; }
512 |
513 | [global::ProtoBuf.ProtoMember(63, Name = @"gamepad_hip_pitch_rate")]
514 | public float GamepadHipPitchRate { get; set; }
515 |
516 | [global::ProtoBuf.ProtoMember(64, Name = @"gamepad_hip_extra_yaw")]
517 | public float GamepadHipExtraYaw { get; set; }
518 |
519 | [global::ProtoBuf.ProtoMember(65, Name = @"gamepad_hip_extra_pitch")]
520 | public float GamepadHipExtraPitch { get; set; }
521 |
522 | [global::ProtoBuf.ProtoMember(66, Name = @"gamepad_hip_ramp_up_time")]
523 | public float GamepadHipRampUpTime { get; set; }
524 |
525 | [global::ProtoBuf.ProtoMember(67, Name = @"gamepad_hip_ramp_up_delay")]
526 | public float GamepadHipRampUpDelay { get; set; }
527 |
528 | [global::ProtoBuf.ProtoMember(68, Name = @"gamepad_zoomed_yaw_rate")]
529 | public float GamepadZoomedYawRate { get; set; }
530 |
531 | [global::ProtoBuf.ProtoMember(69, Name = @"gamepad_zoomed_pitch_rate")]
532 | public float GamepadZoomedPitchRate { get; set; }
533 |
534 | [global::ProtoBuf.ProtoMember(70, Name = @"gamepad_zoomed_extra_yaw")]
535 | public float GamepadZoomedExtraYaw { get; set; }
536 |
537 | [global::ProtoBuf.ProtoMember(71, Name = @"gamepad_zoomed_extra_pitch")]
538 | public float GamepadZoomedExtraPitch { get; set; }
539 |
540 | [global::ProtoBuf.ProtoMember(72, Name = @"gamepad_zoomed_ramp_up_time")]
541 | public float GamepadZoomedRampUpTime { get; set; }
542 |
543 | [global::ProtoBuf.ProtoMember(73, Name = @"gamepad_zoomed_ramp_up_delay")]
544 | public float GamepadZoomedRampUpDelay { get; set; }
545 |
546 | [global::ProtoBuf.ProtoMember(74, Name = @"gamepad_vehicle_yaw_rate")]
547 | public float GamepadVehicleYawRate { get; set; }
548 |
549 | [global::ProtoBuf.ProtoMember(75, Name = @"gamepad_vehicle_pitch_rate")]
550 | public float GamepadVehiclePitchRate { get; set; }
551 |
552 | [global::ProtoBuf.ProtoMember(76, Name = @"gamepad_vehicle_extra_yaw")]
553 | public float GamepadVehicleExtraYaw { get; set; }
554 |
555 | [global::ProtoBuf.ProtoMember(77, Name = @"gamepad_vehicle_extra_pitch")]
556 | public float GamepadVehicleExtraPitch { get; set; }
557 |
558 | [global::ProtoBuf.ProtoMember(78, Name = @"gamepad_vehicle_ramp_up_time")]
559 | public float GamepadVehicleRampUpTime { get; set; }
560 |
561 | [global::ProtoBuf.ProtoMember(79, Name = @"gamepad_vehicle_ramp_up_delay")]
562 | public float GamepadVehicleRampUpDelay { get; set; }
563 |
564 | [global::ProtoBuf.ProtoMember(80, Name = @"ironsight_aim_assist")]
565 | public bool IronsightAimAssist { get; set; }
566 |
567 | [global::ProtoBuf.ProtoMember(81, Name = @"walking_joystick_scheme")]
568 | public uint WalkingJoystickScheme { get; set; }
569 |
570 | [global::ProtoBuf.ProtoMember(82, Name = @"driving_joystick_scheme")]
571 | public uint DrivingJoystickScheme { get; set; }
572 |
573 | [global::ProtoBuf.ProtoMember(83, Name = @"mouse_ads_scale")]
574 | public float MouseAdsScale { get; set; }
575 |
576 | [global::ProtoBuf.ProtoMember(84, Name = @"mouse_vehicle_scale")]
577 | public float MouseVehicleScale { get; set; }
578 |
579 | [global::ProtoBuf.ProtoMember(85, Name = @"mouse_ironsight_aim_assist")]
580 | public bool MouseIronsightAimAssist { get; set; }
581 |
582 | [global::ProtoBuf.ProtoMember(86, Name = @"vehicle_input_mode")]
583 | public uint VehicleInputMode { get; set; }
584 |
585 | [global::ProtoBuf.ProtoMember(87, Name = @"weapon_aim_toggle")]
586 | public bool WeaponAimToggle { get; set; }
587 |
588 | [global::ProtoBuf.ProtoMember(88, Name = @"mantle_requires_button")]
589 | public bool MantleRequiresButton { get; set; }
590 |
591 | [global::ProtoBuf.ProtoMember(89, Name = @"fixed_minimap_rotation")]
592 | public bool FixedMinimapRotation { get; set; }
593 |
594 | [global::ProtoBuf.ProtoMember(90, Name = @"map_invert_pitch")]
595 | public bool MapInvertPitch { get; set; }
596 |
597 | [global::ProtoBuf.ProtoMember(91, Name = @"map_invert_yaw")]
598 | public bool MapInvertYaw { get; set; }
599 |
600 | [global::ProtoBuf.ProtoMember(92, Name = @"difficulty")]
601 | public uint Difficulty { get; set; }
602 |
603 | [global::ProtoBuf.ProtoMember(93, Name = @"swap_dual_wield_controls")]
604 | public bool SwapDualWieldControls { get; set; }
605 |
606 | [global::ProtoBuf.ProtoMember(94, Name = @"base_fov")]
607 | public float BaseFov { get; set; }
608 |
609 | [global::ProtoBuf.ProtoMember(95, Name = @"crosshair_neutral_color_frame")]
610 | public uint CrosshairNeutralColorFrame { get; set; }
611 |
612 | [global::ProtoBuf.ProtoMember(96, Name = @"crosshair_enemy_color_frame")]
613 | public uint CrosshairEnemyColorFrame { get; set; }
614 |
615 | [global::ProtoBuf.ProtoMember(97, Name = @"crosshair_ally_color_frame")]
616 | public uint CrosshairAllyColorFrame { get; set; }
617 |
618 | [global::ProtoBuf.ProtoMember(98, Name = @"enable_subtitles")]
619 | public bool EnableSubtitles { get; set; }
620 |
621 | [global::ProtoBuf.ProtoMember(99, Name = @"enable_closed_captions")]
622 | public bool EnableClosedCaptions { get; set; }
623 |
624 | [global::ProtoBuf.ProtoMember(100, Name = @"last_status_menu_page")]
625 | [global::System.ComponentModel.DefaultValue("")]
626 | public string LastStatusMenuPage { get; set; } = "";
627 |
628 | [global::ProtoBuf.ProtoMember(101, Name = @"inventory_screen_last_filter")]
629 | public global::System.Collections.Generic.List InventoryScreenLastFilters { get; } = new global::System.Collections.Generic.List();
630 |
631 | [global::ProtoBuf.ProtoMember(102, Name = @"tutorial_info")]
632 | public OakProfileMenuTutorialInfo TutorialInfo { get; set; }
633 |
634 | [global::ProtoBuf.ProtoMember(103, Name = @"default_network_type")]
635 | public uint DefaultNetworkType { get; set; }
636 |
637 | [global::ProtoBuf.ProtoMember(104, Name = @"default_invite_type")]
638 | public uint DefaultInviteType { get; set; }
639 |
640 | [global::ProtoBuf.ProtoMember(105, Name = @"matchmaking_region")]
641 | [global::System.ComponentModel.DefaultValue("")]
642 | public string MatchmakingRegion { get; set; } = "";
643 |
644 | [global::ProtoBuf.ProtoMember(106, Name = @"streaming_service")]
645 | public uint StreamingService { get; set; }
646 |
647 | [global::ProtoBuf.ProtoMember(107, Name = @"max_cached_friend_events")]
648 | public int MaxCachedFriendEvents { get; set; }
649 |
650 | [global::ProtoBuf.ProtoMember(108, Name = @"max_cached_friend_statuses")]
651 | public int MaxCachedFriendStatuses { get; set; }
652 |
653 | [global::ProtoBuf.ProtoMember(109, Name = @"friend_events")]
654 | public global::System.Collections.Generic.List FriendEvents { get; } = new global::System.Collections.Generic.List();
655 |
656 | [global::ProtoBuf.ProtoMember(110, Name = @"friend_statuses")]
657 | public global::System.Collections.Generic.List FriendStatuses { get; } = new global::System.Collections.Generic.List();
658 |
659 | [global::ProtoBuf.ProtoMember(111, Name = @"last_whisper_fetch_events_time")]
660 | public long LastWhisperFetchEventsTime { get; set; }
661 |
662 | [global::ProtoBuf.ProtoMember(112, Name = @"last_whisper_fetch_statuses_time")]
663 | public long LastWhisperFetchStatusesTime { get; set; }
664 |
665 | [global::ProtoBuf.ProtoMember(113, Name = @"desired_crossplay_state")]
666 | public uint DesiredCrossplayState { get; set; }
667 |
668 | [global::ProtoBuf.ProtoMember(133, Name = @"friend_encounters")]
669 | public global::System.Collections.Generic.List FriendEncounters { get; } = new global::System.Collections.Generic.List();
670 |
671 | [global::ProtoBuf.ProtoMember(134, Name = @"max_friend_encounter_size")]
672 | public int MaxFriendEncounterSize { get; set; }
673 |
674 | [global::ProtoBuf.ProtoMember(135, Name = @"profile_stats_data")]
675 | public global::System.Collections.Generic.List ProfileStatsDatas { get; } = new global::System.Collections.Generic.List();
676 |
677 | [global::ProtoBuf.ProtoMember(136, Name = @"bank_inventory_category_list")]
678 | public global::System.Collections.Generic.List BankInventoryCategoryLists { get; } = new global::System.Collections.Generic.List();
679 |
680 | [global::ProtoBuf.ProtoMember(137, Name = @"bank_inventory_list")]
681 | public global::System.Collections.Generic.List BankInventoryLists { get; } = new global::System.Collections.Generic.List();
682 |
683 | [global::ProtoBuf.ProtoMember(138, Name = @"lost_loot_inventory_list")]
684 | public global::System.Collections.Generic.List LostLootInventoryLists { get; } = new global::System.Collections.Generic.List();
685 |
686 | [global::ProtoBuf.ProtoMember(139, Name = @"npc_mail_items")]
687 | public global::System.Collections.Generic.List NpcMailItems { get; } = new global::System.Collections.Generic.List();
688 |
689 | [global::ProtoBuf.ProtoMember(140, Name = @"mail_guids")]
690 | public global::System.Collections.Generic.List MailGuids { get; } = new global::System.Collections.Generic.List();
691 |
692 | [global::ProtoBuf.ProtoMember(141, Name = @"unread_mail_guids")]
693 | public global::System.Collections.Generic.List UnreadMailGuids { get; } = new global::System.Collections.Generic.List();
694 |
695 | [global::ProtoBuf.ProtoMember(142, Name = @"gear_sold_by_friends")]
696 | public global::System.Collections.Generic.List GearSoldByFriends { get; } = new global::System.Collections.Generic.List();
697 |
698 | [global::ProtoBuf.ProtoMember(143, Name = @"profile_sdu_list")]
699 | public global::System.Collections.Generic.List ProfileSduLists { get; } = new global::System.Collections.Generic.List();
700 |
701 | [global::ProtoBuf.ProtoMember(144, Name = @"unlocked_customizations")]
702 | public global::System.Collections.Generic.List UnlockedCustomizations { get; } = new global::System.Collections.Generic.List();
703 |
704 | [global::ProtoBuf.ProtoMember(145, Name = @"unlocked_inventory_customization_parts")]
705 | public global::System.Collections.Generic.List UnlockedInventoryCustomizationParts { get; } = new global::System.Collections.Generic.List();
706 |
707 | [global::ProtoBuf.ProtoMember(146, Name = @"guardian_rank")]
708 | public GuardianRankProfileData GuardianRank { get; set; }
709 |
710 | [global::ProtoBuf.ProtoMember(147, Name = @"unlocked_crew_quarters_decorations")]
711 | public global::System.Collections.Generic.List UnlockedCrewQuartersDecorations { get; } = new global::System.Collections.Generic.List();
712 |
713 | [global::ProtoBuf.ProtoMember(148, Name = @"unlocked_crew_quarters_rooms")]
714 | public global::System.Collections.Generic.List UnlockedCrewQuartersRooms { get; } = new global::System.Collections.Generic.List();
715 |
716 | [global::ProtoBuf.ProtoMember(150, Name = @"enable_mouse_acceleration")]
717 | public bool EnableMouseAcceleration { get; set; }
718 |
719 | [global::ProtoBuf.ProtoMember(151, Name = @"enable_gamepad_input")]
720 | public bool EnableGamepadInput { get; set; }
721 |
722 | [global::ProtoBuf.ProtoMember(152, Name = @"use_classic_gamepad_input")]
723 | public bool UseClassicGamepadInput { get; set; }
724 |
725 | [global::ProtoBuf.ProtoMember(153, Name = @"master_volume")]
726 | public float MasterVolume { get; set; }
727 |
728 | [global::ProtoBuf.ProtoMember(154, Name = @"monitor_display_type")]
729 | public uint MonitorDisplayType { get; set; }
730 |
731 | [global::ProtoBuf.ProtoMember(155, Name = @"graphics_mode")]
732 | public uint GraphicsMode { get; set; }
733 |
734 | [global::ProtoBuf.ProtoMember(156, Name = @"frame_rate_limit")]
735 | public uint FrameRateLimit { get; set; }
736 |
737 | [global::ProtoBuf.ProtoMember(157, Name = @"base_vehicle_fov")]
738 | public float BaseVehicleFov { get; set; }
739 |
740 | [global::ProtoBuf.ProtoMember(158, Name = @"graphics_quality")]
741 | public uint GraphicsQuality { get; set; }
742 |
743 | [global::ProtoBuf.ProtoMember(159, Name = @"anisotropic_filtering")]
744 | public uint AnisotropicFiltering { get; set; }
745 |
746 | [global::ProtoBuf.ProtoMember(160, Name = @"shadow_quality")]
747 | public uint ShadowQuality { get; set; }
748 |
749 | [global::ProtoBuf.ProtoMember(161, Name = @"display_performance_stats")]
750 | public uint DisplayPerformanceStats { get; set; }
751 |
752 | [global::ProtoBuf.ProtoMember(162, Name = @"texture_detail")]
753 | public uint TextureDetail { get; set; }
754 |
755 | [global::ProtoBuf.ProtoMember(163, Name = @"draw_distance")]
756 | public uint DrawDistance { get; set; }
757 |
758 | [global::ProtoBuf.ProtoMember(164, Name = @"clutter")]
759 | public uint Clutter { get; set; }
760 |
761 | [global::ProtoBuf.ProtoMember(165, Name = @"tessellation")]
762 | public uint Tessellation { get; set; }
763 |
764 | [global::ProtoBuf.ProtoMember(166, Name = @"foliage")]
765 | public uint Foliage { get; set; }
766 |
767 | [global::ProtoBuf.ProtoMember(167, Name = @"foliage_shadows")]
768 | public bool FoliageShadows { get; set; }
769 |
770 | [global::ProtoBuf.ProtoMember(168, Name = @"planar_reflections")]
771 | public bool PlanarReflections { get; set; }
772 |
773 | [global::ProtoBuf.ProtoMember(169, Name = @"volumetric_fog")]
774 | public uint VolumetricFog { get; set; }
775 |
776 | [global::ProtoBuf.ProtoMember(170, Name = @"screen_space_reflections")]
777 | public uint ScreenSpaceReflections { get; set; }
778 |
779 | [global::ProtoBuf.ProtoMember(171, Name = @"character_texture_detail")]
780 | public uint CharacterTextureDetail { get; set; }
781 |
782 | [global::ProtoBuf.ProtoMember(172, Name = @"character_detail")]
783 | public uint CharacterDetail { get; set; }
784 |
785 | [global::ProtoBuf.ProtoMember(173, Name = @"ambient_occlusion_quality")]
786 | public uint AmbientOcclusionQuality { get; set; }
787 |
788 | [global::ProtoBuf.ProtoMember(174, Name = @"object_motion_blur")]
789 | public bool ObjectMotionBlur { get; set; }
790 |
791 | [global::ProtoBuf.ProtoMember(175, Name = @"lens_flare")]
792 | public bool LensFlare { get; set; }
793 |
794 | [global::ProtoBuf.ProtoMember(176, Name = @"combat_number_long_format")]
795 | public bool CombatNumberLongFormat { get; set; }
796 |
797 | [global::ProtoBuf.ProtoMember(177, Name = @"show_minimap_legendaries")]
798 | public bool ShowMinimapLegendaries { get; set; }
799 |
800 | [global::ProtoBuf.ProtoMember(178, Name = @"use_player_callouts")]
801 | public bool UsePlayerCallouts { get; set; }
802 |
803 | [global::ProtoBuf.ProtoMember(179, Name = @"friend_event_notification_lifetime")]
804 | public uint FriendEventNotificationLifetime { get; set; }
805 |
806 | [global::ProtoBuf.ProtoMember(180, Name = @"friend_event_notification_frequency")]
807 | public uint FriendEventNotificationFrequency { get; set; }
808 |
809 | [global::ProtoBuf.ProtoMember(181, Name = @"trade_request_reception_type")]
810 | public uint TradeRequestReceptionType { get; set; }
811 |
812 | [global::ProtoBuf.ProtoMember(182, Name = @"head_bob_scale")]
813 | public float HeadBobScale { get; set; }
814 |
815 | [global::ProtoBuf.ProtoMember(184, Name = @"has_seen_first_boot")]
816 | public bool HasSeenFirstBoot { get; set; }
817 |
818 | [global::ProtoBuf.ProtoMember(189, Name = @"subs_cc_size")]
819 | public float SubsCcSize { get; set; }
820 |
821 | [global::ProtoBuf.ProtoMember(190, Name = @"cc_subs_background_opacity")]
822 | public float CcSubsBackgroundOpacity { get; set; }
823 |
824 | [global::ProtoBuf.ProtoMember(191, Name = @"walking_button_scheme")]
825 | public uint WalkingButtonScheme { get; set; }
826 |
827 | [global::ProtoBuf.ProtoMember(192, Name = @"driving_button_scheme")]
828 | public uint DrivingButtonScheme { get; set; }
829 |
830 | [global::ProtoBuf.ProtoMember(193, Name = @"glyph_mode")]
831 | public uint GlyphMode { get; set; }
832 |
833 | [global::ProtoBuf.ProtoMember(194, Name = @"use_MPH")]
834 | public bool useMPH { get; set; }
835 |
836 | [global::ProtoBuf.ProtoMember(195, Name = @"registered_downloadable_entitlements")]
837 | public global::System.Collections.Generic.List RegisteredDownloadableEntitlements { get; } = new global::System.Collections.Generic.List();
838 |
839 | [global::ProtoBuf.ProtoMember(196, Name = @"seen_news_items")]
840 | public global::System.Collections.Generic.List SeenNewsItems { get; } = new global::System.Collections.Generic.List();
841 |
842 | [global::ProtoBuf.ProtoMember(197, Name = @"auto_centering_enabled")]
843 | public bool AutoCenteringEnabled { get; set; }
844 |
845 | [global::ProtoBuf.ProtoMember(198, Name = @"increased_chance_for_subscribers")]
846 | public bool IncreasedChanceForSubscribers { get; set; }
847 |
848 | [global::ProtoBuf.ProtoMember(199, Name = @"rare_chest_event_enabled")]
849 | public bool RareChestEventEnabled { get; set; }
850 |
851 | [global::ProtoBuf.ProtoMember(200, Name = @"badass_event_enabled")]
852 | public bool BadassEventEnabled { get; set; }
853 |
854 | [global::ProtoBuf.ProtoMember(201, Name = @"pinata_event_enabled")]
855 | public bool PinataEventEnabled { get; set; }
856 |
857 | [global::ProtoBuf.ProtoMember(202, Name = @"min_time_between_badass_events")]
858 | public int MinTimeBetweenBadassEvents { get; set; }
859 |
860 | [global::ProtoBuf.ProtoMember(203, Name = @"hud_scale_multiplier")]
861 | public float HudScaleMultiplier { get; set; }
862 |
863 | [global::ProtoBuf.ProtoMember(204, Name = @"disable_spatial_audio")]
864 | public bool DisableSpatialAudio { get; set; }
865 |
866 | [global::ProtoBuf.ProtoMember(205, Name = @"total_playtime_seconds")]
867 | public int TotalPlaytimeSeconds { get; set; }
868 |
869 | [global::ProtoBuf.ProtoMember(206, Name = @"moxxis_drink_event_enabled")]
870 | public bool MoxxisDrinkEventEnabled { get; set; }
871 |
872 | [global::ProtoBuf.ProtoMember(207, Name = @"moxxis_drink_event_bits_product_id")]
873 | public int MoxxisDrinkEventBitsProductId { get; set; }
874 |
875 | [global::ProtoBuf.ProtoMember(208, Name = @"challenge_data")]
876 | public global::System.Collections.Generic.List ChallengeDatas { get; } = new global::System.Collections.Generic.List();
877 |
878 | [global::ProtoBuf.ProtoMember(209, Name = @"CitizenScienceLevelProgression", IsPacked = true)]
879 | public int[] CitizenScienceLevelProgressions { get; set; }
880 |
881 | [global::ProtoBuf.ProtoMember(211, Name = @"disable_event_content")]
882 | public bool DisableEventContent { get; set; }
883 |
884 | [global::ProtoBuf.ProtoMember(212, Name = @"desired_friend_sync_state")]
885 | public uint DesiredFriendSyncState { get; set; }
886 |
887 | [global::ProtoBuf.ProtoMember(213, Name = @"needs_shift_first_boot")]
888 | public bool NeedsShiftFirstBoot { get; set; }
889 |
890 | [global::ProtoBuf.ProtoMember(214, Name = @"recently_met_players")]
891 | public global::System.Collections.Generic.List RecentlyMetPlayers { get; } = new global::System.Collections.Generic.List();
892 |
893 | [global::ProtoBuf.ProtoMember(215)]
894 | public int CitizenScienceActiveBoosterIndex { get; set; }
895 |
896 | [global::ProtoBuf.ProtoMember(216)]
897 | public float CitizenScienceActiveBoosterRemainingTime { get; set; }
898 |
899 | [global::ProtoBuf.ProtoMember(217)]
900 | public float CitizenScienceActiveBoosterTotalTime { get; set; }
901 |
902 | [global::ProtoBuf.ProtoMember(218)]
903 | public int StreamerPrimaryActiveBoosterIndex { get; set; }
904 |
905 | [global::ProtoBuf.ProtoMember(219)]
906 | public float StreamerPrimaryActiveBoosterRemainingTime { get; set; }
907 |
908 | [global::ProtoBuf.ProtoMember(220)]
909 | public float StreamerPrimaryActiveBoosterTotalTime { get; set; }
910 |
911 | [global::ProtoBuf.ProtoMember(221)]
912 | public int StreamerSecondaryActiveBoosterIndex { get; set; }
913 |
914 | [global::ProtoBuf.ProtoMember(222)]
915 | public float StreamerSecondaryActiveBoosterRemainingTime { get; set; }
916 |
917 | [global::ProtoBuf.ProtoMember(223)]
918 | public float StreamerSecondaryActiveBoosterTotalTime { get; set; }
919 |
920 | [global::ProtoBuf.ProtoMember(224)]
921 | public int StreamerBoosterTier { get; set; }
922 |
923 | [global::ProtoBuf.ProtoMember(226)]
924 | public int CitizenScienceCSBucksAmount { get; set; }
925 |
926 | [global::ProtoBuf.ProtoMember(227)]
927 | public bool bCitizenScienceHasSeenIntroVideo { get; set; }
928 |
929 | [global::ProtoBuf.ProtoMember(228)]
930 | public bool bCitizenScienceTutorialDone { get; set; }
931 |
932 | [global::ProtoBuf.ProtoMember(230)]
933 | public bool fixed_initial_zonemap_rotation { get; set; }
934 |
935 | [global::ProtoBuf.ProtoContract()]
936 | public partial class FriendEncountersEntry : global::ProtoBuf.IExtensible
937 | {
938 | private global::ProtoBuf.IExtension __pbn__extensionData;
939 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
940 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
941 |
942 | [global::ProtoBuf.ProtoMember(1, Name = @"key")]
943 | [global::System.ComponentModel.DefaultValue("")]
944 | public string Key { get; set; } = "";
945 |
946 | [global::ProtoBuf.ProtoMember(2, Name = @"value")]
947 | public OakFriendEncounterData Value { get; set; }
948 |
949 | }
950 |
951 | }
952 |
953 | }
954 |
955 | #pragma warning restore CS0612, CS1591, CS3021, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
956 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/Definitions/OakSave.cs:
--------------------------------------------------------------------------------
1 | // This file was generated by a tool; you should avoid making direct changes.
2 | // Consider using 'partial classes' to extend these types
3 | // Input: OakSave.proto
4 |
5 | #pragma warning disable CS0612, CS1591, CS3021, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
6 | namespace OakSave
7 | {
8 |
9 | [global::ProtoBuf.ProtoContract()]
10 | public partial class PlayerClassSaveGameData : global::ProtoBuf.IExtensible
11 | {
12 | private global::ProtoBuf.IExtension __pbn__extensionData;
13 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
14 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
15 |
16 | [global::ProtoBuf.ProtoMember(1, Name = @"player_class_path")]
17 | [global::System.ComponentModel.DefaultValue("")]
18 | public string PlayerClassPath { get; set; } = "";
19 |
20 | [global::ProtoBuf.ProtoMember(2, Name = @"dlc_package_id")]
21 | public uint DlcPackageId { get; set; }
22 |
23 | }
24 |
25 | [global::ProtoBuf.ProtoContract()]
26 | public partial class ResourcePoolSavegameData : global::ProtoBuf.IExtensible
27 | {
28 | private global::ProtoBuf.IExtension __pbn__extensionData;
29 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
30 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
31 |
32 | [global::ProtoBuf.ProtoMember(1, Name = @"amount")]
33 | public float Amount { get; set; }
34 |
35 | [global::ProtoBuf.ProtoMember(2, Name = @"resource_path")]
36 | [global::System.ComponentModel.DefaultValue("")]
37 | public string ResourcePath { get; set; } = "";
38 |
39 | }
40 |
41 | [global::ProtoBuf.ProtoContract()]
42 | public partial class RegionSaveGameData : global::ProtoBuf.IExtensible
43 | {
44 | private global::ProtoBuf.IExtension __pbn__extensionData;
45 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
46 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
47 |
48 | [global::ProtoBuf.ProtoMember(1, Name = @"game_stage")]
49 | public int GameStage { get; set; }
50 |
51 | [global::ProtoBuf.ProtoMember(2, Name = @"play_through_idx")]
52 | public int PlayThroughIdx { get; set; }
53 |
54 | [global::ProtoBuf.ProtoMember(3, Name = @"region_path")]
55 | [global::System.ComponentModel.DefaultValue("")]
56 | public string RegionPath { get; set; } = "";
57 |
58 | [global::ProtoBuf.ProtoMember(4, Name = @"dlc_package_id")]
59 | public uint DlcPackageId { get; set; }
60 |
61 | }
62 |
63 | [global::ProtoBuf.ProtoContract()]
64 | public partial class InventoryBalanceStateInitializationData : global::ProtoBuf.IExtensible
65 | {
66 | private global::ProtoBuf.IExtension __pbn__extensionData;
67 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
68 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
69 |
70 | [global::ProtoBuf.ProtoMember(1, Name = @"game_stage")]
71 | public int GameStage { get; set; }
72 |
73 | [global::ProtoBuf.ProtoMember(2, Name = @"inventory_data")]
74 | [global::System.ComponentModel.DefaultValue("")]
75 | public string InventoryData { get; set; } = "";
76 |
77 | [global::ProtoBuf.ProtoMember(3, Name = @"inventory_balance_data")]
78 | [global::System.ComponentModel.DefaultValue("")]
79 | public string InventoryBalanceData { get; set; } = "";
80 |
81 | [global::ProtoBuf.ProtoMember(4, Name = @"manufacturer_data")]
82 | [global::System.ComponentModel.DefaultValue("")]
83 | public string ManufacturerData { get; set; } = "";
84 |
85 | [global::ProtoBuf.ProtoMember(5, Name = @"part_list")]
86 | public global::System.Collections.Generic.List PartLists { get; } = new global::System.Collections.Generic.List();
87 |
88 | [global::ProtoBuf.ProtoMember(6, Name = @"generic_part_list")]
89 | public global::System.Collections.Generic.List GenericPartLists { get; } = new global::System.Collections.Generic.List();
90 |
91 | [global::ProtoBuf.ProtoMember(7, Name = @"additional_data")]
92 | public byte[] AdditionalData { get; set; }
93 |
94 | [global::ProtoBuf.ProtoMember(8, Name = @"customization_part_list")]
95 | public global::System.Collections.Generic.List CustomizationPartLists { get; } = new global::System.Collections.Generic.List();
96 |
97 | }
98 |
99 | [global::ProtoBuf.ProtoContract()]
100 | public partial class OakInventoryItemSaveGameData : global::ProtoBuf.IExtensible
101 | {
102 | private global::ProtoBuf.IExtension __pbn__extensionData;
103 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
104 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
105 |
106 | [global::ProtoBuf.ProtoMember(1, Name = @"item_serial_number")]
107 | public byte[] ItemSerialNumber { get; set; }
108 |
109 | [global::ProtoBuf.ProtoMember(2, Name = @"pickup_order_index")]
110 | public int PickupOrderIndex { get; set; }
111 |
112 | [global::ProtoBuf.ProtoMember(3, Name = @"flags")]
113 | public int Flags { get; set; }
114 |
115 | [global::ProtoBuf.ProtoMember(4, Name = @"weapon_skin_path")]
116 | [global::System.ComponentModel.DefaultValue("")]
117 | public string WeaponSkinPath { get; set; } = "";
118 |
119 | [global::ProtoBuf.ProtoMember(5, Name = @"development_save_data")]
120 | public InventoryBalanceStateInitializationData DevelopmentSaveData { get; set; }
121 |
122 | }
123 |
124 | [global::ProtoBuf.ProtoContract()]
125 | public partial class EquippedInventorySaveGameData : global::ProtoBuf.IExtensible
126 | {
127 | private global::ProtoBuf.IExtension __pbn__extensionData;
128 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
129 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
130 |
131 | [global::ProtoBuf.ProtoMember(1, Name = @"inventory_list_index")]
132 | public int InventoryListIndex { get; set; }
133 |
134 | [global::ProtoBuf.ProtoMember(2, Name = @"enabled")]
135 | public bool Enabled { get; set; }
136 |
137 | [global::ProtoBuf.ProtoMember(3, Name = @"slot_data_path")]
138 | [global::System.ComponentModel.DefaultValue("")]
139 | public string SlotDataPath { get; set; } = "";
140 |
141 | [global::ProtoBuf.ProtoMember(4, Name = @"trinket_data_path")]
142 | [global::System.ComponentModel.DefaultValue("")]
143 | public string TrinketDataPath { get; set; } = "";
144 |
145 | }
146 |
147 | [global::ProtoBuf.ProtoContract()]
148 | public partial class OakAbilityTreeItemSaveGameData : global::ProtoBuf.IExtensible
149 | {
150 | private global::ProtoBuf.IExtension __pbn__extensionData;
151 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
152 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
153 |
154 | [global::ProtoBuf.ProtoMember(1, Name = @"item_asset_path")]
155 | [global::System.ComponentModel.DefaultValue("")]
156 | public string ItemAssetPath { get; set; } = "";
157 |
158 | [global::ProtoBuf.ProtoMember(2, Name = @"points")]
159 | public int Points { get; set; }
160 |
161 | [global::ProtoBuf.ProtoMember(3, Name = @"max_points")]
162 | public int MaxPoints { get; set; }
163 |
164 | [global::ProtoBuf.ProtoMember(4, Name = @"tree_identifier")]
165 | public int TreeIdentifier { get; set; }
166 |
167 | }
168 |
169 | [global::ProtoBuf.ProtoContract()]
170 | public partial class OakAbilitySlotSaveGameData : global::ProtoBuf.IExtensible
171 | {
172 | private global::ProtoBuf.IExtension __pbn__extensionData;
173 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
174 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
175 |
176 | [global::ProtoBuf.ProtoMember(1, Name = @"ability_class_path")]
177 | [global::System.ComponentModel.DefaultValue("")]
178 | public string AbilityClassPath { get; set; } = "";
179 |
180 | [global::ProtoBuf.ProtoMember(2, Name = @"slot_asset_path")]
181 | [global::System.ComponentModel.DefaultValue("")]
182 | public string SlotAssetPath { get; set; } = "";
183 |
184 | }
185 |
186 | [global::ProtoBuf.ProtoContract()]
187 | public partial class OakActionAbilityAugmentSaveGameData : global::ProtoBuf.IExtensible
188 | {
189 | private global::ProtoBuf.IExtension __pbn__extensionData;
190 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
191 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
192 |
193 | [global::ProtoBuf.ProtoMember(1, Name = @"action_ability_class_path")]
194 | [global::System.ComponentModel.DefaultValue("")]
195 | public string ActionAbilityClassPath { get; set; } = "";
196 |
197 | [global::ProtoBuf.ProtoMember(2, Name = @"slot_asset_path")]
198 | [global::System.ComponentModel.DefaultValue("")]
199 | public string SlotAssetPath { get; set; } = "";
200 |
201 | [global::ProtoBuf.ProtoMember(3, Name = @"augment_asset_path")]
202 | [global::System.ComponentModel.DefaultValue("")]
203 | public string AugmentAssetPath { get; set; } = "";
204 |
205 | }
206 |
207 | [global::ProtoBuf.ProtoContract()]
208 | public partial class OakActionAbilityAugmentConfigurationSaveGameData : global::ProtoBuf.IExtensible
209 | {
210 | private global::ProtoBuf.IExtension __pbn__extensionData;
211 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
212 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
213 |
214 | [global::ProtoBuf.ProtoMember(1, Name = @"ability_class_path")]
215 | [global::System.ComponentModel.DefaultValue("")]
216 | public string AbilityClassPath { get; set; } = "";
217 |
218 | [global::ProtoBuf.ProtoMember(2, Name = @"augment_asset_path")]
219 | [global::System.ComponentModel.DefaultValue("")]
220 | public string AugmentAssetPath { get; set; } = "";
221 |
222 | [global::ProtoBuf.ProtoMember(3, Name = @"mod_slot_asset_path")]
223 | [global::System.ComponentModel.DefaultValue("")]
224 | public string ModSlotAssetPath { get; set; } = "";
225 |
226 | [global::ProtoBuf.ProtoMember(4, Name = @"mod_asset_path")]
227 | [global::System.ComponentModel.DefaultValue("")]
228 | public string ModAssetPath { get; set; } = "";
229 |
230 | }
231 |
232 | [global::ProtoBuf.ProtoContract()]
233 | public partial class OakPlayerAbilitySaveGameData : global::ProtoBuf.IExtensible
234 | {
235 | private global::ProtoBuf.IExtension __pbn__extensionData;
236 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
237 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
238 |
239 | [global::ProtoBuf.ProtoMember(1, Name = @"ability_points")]
240 | public int AbilityPoints { get; set; }
241 |
242 | [global::ProtoBuf.ProtoMember(2, Name = @"tree_item_list")]
243 | public global::System.Collections.Generic.List TreeItemLists { get; } = new global::System.Collections.Generic.List();
244 |
245 | [global::ProtoBuf.ProtoMember(3, Name = @"ability_slot_list")]
246 | public global::System.Collections.Generic.List AbilitySlotLists { get; } = new global::System.Collections.Generic.List();
247 |
248 | [global::ProtoBuf.ProtoMember(4, Name = @"augment_slot_list")]
249 | public global::System.Collections.Generic.List AugmentSlotLists { get; } = new global::System.Collections.Generic.List();
250 |
251 | [global::ProtoBuf.ProtoMember(5, Name = @"augment_configuration_list")]
252 | public global::System.Collections.Generic.List AugmentConfigurationLists { get; } = new global::System.Collections.Generic.List();
253 |
254 | [global::ProtoBuf.ProtoMember(6, Name = @"tree_grade")]
255 | public int TreeGrade { get; set; }
256 |
257 | }
258 |
259 | [global::ProtoBuf.ProtoContract()]
260 | public partial class MissionStatusPlayerSaveGameData : global::ProtoBuf.IExtensible
261 | {
262 | private global::ProtoBuf.IExtension __pbn__extensionData;
263 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
264 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
265 |
266 | [global::ProtoBuf.ProtoMember(1, Name = @"status")]
267 | public MissionState Status { get; set; }
268 |
269 | [global::ProtoBuf.ProtoMember(2, Name = @"has_been_viewed_in_log")]
270 | public bool HasBeenViewedInLog { get; set; }
271 |
272 | [global::ProtoBuf.ProtoMember(3, Name = @"objectives_progress", IsPacked = true)]
273 | public int[] ObjectivesProgresses { get; set; }
274 |
275 | [global::ProtoBuf.ProtoMember(4, Name = @"mission_class_path")]
276 | [global::System.ComponentModel.DefaultValue("")]
277 | public string MissionClassPath { get; set; } = "";
278 |
279 | [global::ProtoBuf.ProtoMember(5, Name = @"active_objective_set_path")]
280 | [global::System.ComponentModel.DefaultValue("")]
281 | public string ActiveObjectiveSetPath { get; set; } = "";
282 |
283 | [global::ProtoBuf.ProtoMember(6, Name = @"dlc_package_id")]
284 | public uint DlcPackageId { get; set; }
285 |
286 | [global::ProtoBuf.ProtoMember(7, Name = @"kickoff_played")]
287 | public bool KickoffPlayed { get; set; }
288 |
289 | [global::ProtoBuf.ProtoMember(8, Name = @"league_instance")]
290 | public uint LeagueInstance { get; set; }
291 |
292 | [global::ProtoBuf.ProtoContract()]
293 | public enum MissionState
294 | {
295 | [global::ProtoBuf.ProtoEnum(Name = @"MS_NotStarted")]
296 | MSNotStarted = 0,
297 | [global::ProtoBuf.ProtoEnum(Name = @"MS_Active")]
298 | MSActive = 1,
299 | [global::ProtoBuf.ProtoEnum(Name = @"MS_Complete")]
300 | MSComplete = 2,
301 | [global::ProtoBuf.ProtoEnum(Name = @"MS_Failed")]
302 | MSFailed = 3,
303 | [global::ProtoBuf.ProtoEnum(Name = @"MS_Unknown")]
304 | MSUnknown = 4,
305 | }
306 |
307 | }
308 |
309 | [global::ProtoBuf.ProtoContract()]
310 | public partial class MissionPlaythroughSaveGameData : global::ProtoBuf.IExtensible
311 | {
312 | private global::ProtoBuf.IExtension __pbn__extensionData;
313 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
314 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
315 |
316 | [global::ProtoBuf.ProtoMember(1, Name = @"mission_list")]
317 | public global::System.Collections.Generic.List MissionLists { get; } = new global::System.Collections.Generic.List();
318 |
319 | [global::ProtoBuf.ProtoMember(2, Name = @"tracked_mission_class_path")]
320 | [global::System.ComponentModel.DefaultValue("")]
321 | public string TrackedMissionClassPath { get; set; } = "";
322 |
323 | }
324 |
325 | [global::ProtoBuf.ProtoContract()]
326 | public partial class ActiveFastTravelSaveData : global::ProtoBuf.IExtensible
327 | {
328 | private global::ProtoBuf.IExtension __pbn__extensionData;
329 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
330 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
331 |
332 | [global::ProtoBuf.ProtoMember(1, Name = @"active_travel_station_name")]
333 | [global::System.ComponentModel.DefaultValue("")]
334 | public string ActiveTravelStationName { get; set; } = "";
335 |
336 | [global::ProtoBuf.ProtoMember(2, Name = @"blacklisted")]
337 | public bool Blacklisted { get; set; }
338 |
339 | }
340 |
341 | [global::ProtoBuf.ProtoContract()]
342 | public partial class PlaythroughActiveFastTravelSaveData : global::ProtoBuf.IExtensible
343 | {
344 | private global::ProtoBuf.IExtension __pbn__extensionData;
345 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
346 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
347 |
348 | [global::ProtoBuf.ProtoMember(1, Name = @"active_travel_stations")]
349 | public global::System.Collections.Generic.List ActiveTravelStations { get; } = new global::System.Collections.Generic.List();
350 |
351 | }
352 |
353 | [global::ProtoBuf.ProtoContract()]
354 | public partial class DiscoveredAreaInfo : global::ProtoBuf.IExtensible
355 | {
356 | private global::ProtoBuf.IExtension __pbn__extensionData;
357 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
358 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
359 |
360 | [global::ProtoBuf.ProtoMember(1, Name = @"discovered_area_name")]
361 | [global::System.ComponentModel.DefaultValue("")]
362 | public string DiscoveredAreaName { get; set; } = "";
363 |
364 | [global::ProtoBuf.ProtoMember(2, Name = @"discovered_playthroughs")]
365 | public uint DiscoveredPlaythroughs { get; set; }
366 |
367 | }
368 |
369 | [global::ProtoBuf.ProtoContract()]
370 | public partial class DiscoveredLevelInfo : global::ProtoBuf.IExtensible
371 | {
372 | private global::ProtoBuf.IExtension __pbn__extensionData;
373 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
374 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
375 |
376 | [global::ProtoBuf.ProtoMember(1, Name = @"discovered_level_name")]
377 | [global::System.ComponentModel.DefaultValue("")]
378 | public string DiscoveredLevelName { get; set; } = "";
379 |
380 | [global::ProtoBuf.ProtoMember(3, Name = @"discovered_playthroughs")]
381 | public uint DiscoveredPlaythroughs { get; set; }
382 |
383 | [global::ProtoBuf.ProtoMember(4, Name = @"discovered_area_info")]
384 | public global::System.Collections.Generic.List DiscoveredAreaInfoes { get; } = new global::System.Collections.Generic.List();
385 |
386 | }
387 |
388 | [global::ProtoBuf.ProtoContract()]
389 | public partial class DiscoveredPlanetInfo : global::ProtoBuf.IExtensible
390 | {
391 | private global::ProtoBuf.IExtension __pbn__extensionData;
392 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
393 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
394 |
395 | [global::ProtoBuf.ProtoMember(1, Name = @"discovered_planet")]
396 | [global::System.ComponentModel.DefaultValue("")]
397 | public string DiscoveredPlanet { get; set; } = "";
398 |
399 | [global::ProtoBuf.ProtoMember(2, Name = @"is_new_planet")]
400 | public bool IsNewPlanet { get; set; }
401 |
402 | }
403 |
404 | [global::ProtoBuf.ProtoContract()]
405 | public partial class DiscoverySaveData : global::ProtoBuf.IExtensible
406 | {
407 | private global::ProtoBuf.IExtension __pbn__extensionData;
408 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
409 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
410 |
411 | [global::ProtoBuf.ProtoMember(1, Name = @"discovered_level_info")]
412 | public global::System.Collections.Generic.List DiscoveredLevelInfoes { get; } = new global::System.Collections.Generic.List();
413 |
414 | }
415 |
416 | [global::ProtoBuf.ProtoContract()]
417 | public partial class VehicleUnlockedSaveGameData : global::ProtoBuf.IExtensible
418 | {
419 | private global::ProtoBuf.IExtension __pbn__extensionData;
420 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
421 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
422 |
423 | [global::ProtoBuf.ProtoMember(1, Name = @"asset_path")]
424 | [global::System.ComponentModel.DefaultValue("")]
425 | public string AssetPath { get; set; } = "";
426 |
427 | [global::ProtoBuf.ProtoMember(2, Name = @"just_unlocked")]
428 | public bool JustUnlocked { get; set; }
429 |
430 | }
431 |
432 | [global::ProtoBuf.ProtoContract()]
433 | public partial class OakCARMenuVehicleConfigSaveData : global::ProtoBuf.IExtensible
434 | {
435 | private global::ProtoBuf.IExtension __pbn__extensionData;
436 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
437 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
438 |
439 | [global::ProtoBuf.ProtoMember(1, Name = @"loadout_save_name")]
440 | [global::System.ComponentModel.DefaultValue("")]
441 | public string LoadoutSaveName { get; set; } = "";
442 |
443 | [global::ProtoBuf.ProtoMember(2, Name = @"body_asset_path")]
444 | [global::System.ComponentModel.DefaultValue("")]
445 | public string BodyAssetPath { get; set; } = "";
446 |
447 | [global::ProtoBuf.ProtoMember(3, Name = @"wheel_asset_path")]
448 | [global::System.ComponentModel.DefaultValue("")]
449 | public string WheelAssetPath { get; set; } = "";
450 |
451 | [global::ProtoBuf.ProtoMember(4, Name = @"armor_asset_path")]
452 | [global::System.ComponentModel.DefaultValue("")]
453 | public string ArmorAssetPath { get; set; } = "";
454 |
455 | [global::ProtoBuf.ProtoMember(5, Name = @"core_mod_asset_path")]
456 | [global::System.ComponentModel.DefaultValue("")]
457 | public string CoreModAssetPath { get; set; } = "";
458 |
459 | [global::ProtoBuf.ProtoMember(6, Name = @"gunner_weapon_asset_path")]
460 | [global::System.ComponentModel.DefaultValue("")]
461 | public string GunnerWeaponAssetPath { get; set; } = "";
462 |
463 | [global::ProtoBuf.ProtoMember(7, Name = @"driver_weapon_asset_path")]
464 | [global::System.ComponentModel.DefaultValue("")]
465 | public string DriverWeaponAssetPath { get; set; } = "";
466 |
467 | [global::ProtoBuf.ProtoMember(8, Name = @"ornament_asset_path")]
468 | [global::System.ComponentModel.DefaultValue("")]
469 | public string OrnamentAssetPath { get; set; } = "";
470 |
471 | [global::ProtoBuf.ProtoMember(9, Name = @"material_decal_asset_path")]
472 | [global::System.ComponentModel.DefaultValue("")]
473 | public string MaterialDecalAssetPath { get; set; } = "";
474 |
475 | [global::ProtoBuf.ProtoMember(10, Name = @"material_asset_path")]
476 | [global::System.ComponentModel.DefaultValue("")]
477 | public string MaterialAssetPath { get; set; } = "";
478 |
479 | [global::ProtoBuf.ProtoMember(11, Name = @"color_index_1")]
480 | public int ColorIndex1 { get; set; }
481 |
482 | [global::ProtoBuf.ProtoMember(12, Name = @"color_index_2")]
483 | public int ColorIndex2 { get; set; }
484 |
485 | [global::ProtoBuf.ProtoMember(13, Name = @"color_index_3")]
486 | public int ColorIndex3 { get; set; }
487 |
488 | }
489 |
490 | [global::ProtoBuf.ProtoContract()]
491 | public partial class CustomPlayerColorSaveGameData : global::ProtoBuf.IExtensible
492 | {
493 | private global::ProtoBuf.IExtension __pbn__extensionData;
494 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
495 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
496 |
497 | [global::ProtoBuf.ProtoMember(1, Name = @"color_parameter")]
498 | [global::System.ComponentModel.DefaultValue("")]
499 | public string ColorParameter { get; set; } = "";
500 |
501 | [global::ProtoBuf.ProtoMember(2, Name = @"applied_color")]
502 | public Vec3 AppliedColor { get; set; }
503 |
504 | [global::ProtoBuf.ProtoMember(3, Name = @"split_color")]
505 | public Vec3 SplitColor { get; set; }
506 |
507 | [global::ProtoBuf.ProtoMember(4, Name = @"use_default_color")]
508 | public bool UseDefaultColor { get; set; }
509 |
510 | [global::ProtoBuf.ProtoMember(5, Name = @"use_default_split_color")]
511 | public bool UseDefaultSplitColor { get; set; }
512 |
513 | }
514 |
515 | [global::ProtoBuf.ProtoContract()]
516 | public partial class GuardianRankSaveGameData : global::ProtoBuf.IExtensible
517 | {
518 | private global::ProtoBuf.IExtension __pbn__extensionData;
519 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
520 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
521 |
522 | [global::ProtoBuf.ProtoMember(1, Name = @"guardian_rank")]
523 | public int GuardianRank { get; set; }
524 |
525 | [global::ProtoBuf.ProtoMember(2, Name = @"guardian_experience")]
526 | public int GuardianExperience { get; set; }
527 |
528 | }
529 |
530 | [global::ProtoBuf.ProtoContract()]
531 | public partial class GuardianRankRewardCharacterSaveGameData : global::ProtoBuf.IExtensible
532 | {
533 | private global::ProtoBuf.IExtension __pbn__extensionData;
534 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
535 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
536 |
537 | [global::ProtoBuf.ProtoMember(1, Name = @"num_tokens")]
538 | public int NumTokens { get; set; }
539 |
540 | [global::ProtoBuf.ProtoMember(2, Name = @"is_enabled")]
541 | public bool IsEnabled { get; set; }
542 |
543 | [global::ProtoBuf.ProtoMember(3, Name = @"reward_data_path")]
544 | [global::System.ComponentModel.DefaultValue("")]
545 | public string RewardDataPath { get; set; } = "";
546 |
547 | }
548 |
549 | [global::ProtoBuf.ProtoContract()]
550 | public partial class GuardianRankPerkCharacterSaveGameData : global::ProtoBuf.IExtensible
551 | {
552 | private global::ProtoBuf.IExtension __pbn__extensionData;
553 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
554 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
555 |
556 | [global::ProtoBuf.ProtoMember(1, Name = @"is_enabled")]
557 | public bool IsEnabled { get; set; }
558 |
559 | [global::ProtoBuf.ProtoMember(2, Name = @"perk_data_path")]
560 | [global::System.ComponentModel.DefaultValue("")]
561 | public string PerkDataPath { get; set; } = "";
562 |
563 | }
564 |
565 | [global::ProtoBuf.ProtoContract()]
566 | public partial class GuardianRankCharacterSaveGameData : global::ProtoBuf.IExtensible
567 | {
568 | private global::ProtoBuf.IExtension __pbn__extensionData;
569 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
570 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
571 |
572 | [global::ProtoBuf.ProtoMember(1, Name = @"guardian_available_tokens")]
573 | public int GuardianAvailableTokens { get; set; }
574 |
575 | [global::ProtoBuf.ProtoMember(2, Name = @"guardian_rank")]
576 | public int GuardianRank { get; set; }
577 |
578 | [global::ProtoBuf.ProtoMember(3, Name = @"guardian_experience")]
579 | public int GuardianExperience { get; set; }
580 |
581 | [global::ProtoBuf.ProtoMember(4, Name = @"rank_rewards")]
582 | public global::System.Collections.Generic.List RankRewards { get; } = new global::System.Collections.Generic.List();
583 |
584 | [global::ProtoBuf.ProtoMember(5, Name = @"rank_perks")]
585 | public global::System.Collections.Generic.List RankPerks { get; } = new global::System.Collections.Generic.List();
586 |
587 | [global::ProtoBuf.ProtoMember(6, Name = @"guardian_reward_random_seed")]
588 | public int GuardianRewardRandomSeed { get; set; }
589 |
590 | [global::ProtoBuf.ProtoMember(7, Name = @"new_guardian_experience")]
591 | public long NewGuardianExperience { get; set; }
592 |
593 | [global::ProtoBuf.ProtoMember(8, Name = @"is_rank_system_enabled")]
594 | public bool IsRankSystemEnabled { get; set; }
595 |
596 | }
597 |
598 | [global::ProtoBuf.ProtoContract()]
599 | public partial class CrewQuartersDecorationSaveData : global::ProtoBuf.IExtensible
600 | {
601 | private global::ProtoBuf.IExtension __pbn__extensionData;
602 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
603 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
604 |
605 | [global::ProtoBuf.ProtoMember(1, Name = @"decoration_index")]
606 | public int DecorationIndex { get; set; }
607 |
608 | [global::ProtoBuf.ProtoMember(2, Name = @"decoration_data_path")]
609 | [global::System.ComponentModel.DefaultValue("")]
610 | public string DecorationDataPath { get; set; } = "";
611 |
612 | }
613 |
614 | [global::ProtoBuf.ProtoContract()]
615 | public partial class CrewQuartersSaveData : global::ProtoBuf.IExtensible
616 | {
617 | private global::ProtoBuf.IExtension __pbn__extensionData;
618 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
619 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
620 |
621 | [global::ProtoBuf.ProtoMember(1, Name = @"preferred_room_assignment")]
622 | public int PreferredRoomAssignment { get; set; }
623 |
624 | [global::ProtoBuf.ProtoMember(2, Name = @"decorations")]
625 | public global::System.Collections.Generic.List Decorations { get; } = new global::System.Collections.Generic.List();
626 |
627 | [global::ProtoBuf.ProtoMember(3, Name = @"room_data_path")]
628 | [global::System.ComponentModel.DefaultValue("")]
629 | public string RoomDataPath { get; set; } = "";
630 |
631 | }
632 |
633 | [global::ProtoBuf.ProtoContract()]
634 | public partial class CrewQuartersGunRackItemSaveData : global::ProtoBuf.IExtensible
635 | {
636 | private global::ProtoBuf.IExtension __pbn__extensionData;
637 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
638 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
639 |
640 | [global::ProtoBuf.ProtoMember(1, Name = @"encrypted_serial_number")]
641 | public byte[] EncryptedSerialNumber { get; set; }
642 |
643 | [global::ProtoBuf.ProtoMember(2, Name = @"slot_asset_path")]
644 | [global::System.ComponentModel.DefaultValue("")]
645 | public string SlotAssetPath { get; set; } = "";
646 |
647 | [global::ProtoBuf.ProtoMember(3, Name = @"development_save_data")]
648 | public InventoryBalanceStateInitializationData DevelopmentSaveData { get; set; }
649 |
650 | }
651 |
652 | [global::ProtoBuf.ProtoContract()]
653 | public partial class CrewQuartersGunRackSaveData : global::ProtoBuf.IExtensible
654 | {
655 | private global::ProtoBuf.IExtension __pbn__extensionData;
656 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
657 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
658 |
659 | [global::ProtoBuf.ProtoMember(1, Name = @"rack_save_data")]
660 | public global::System.Collections.Generic.List RackSaveDatas { get; } = new global::System.Collections.Generic.List();
661 |
662 | }
663 |
664 | [global::ProtoBuf.ProtoContract()]
665 | public partial class EchoLogSaveGameData : global::ProtoBuf.IExtensible
666 | {
667 | private global::ProtoBuf.IExtension __pbn__extensionData;
668 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
669 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
670 |
671 | [global::ProtoBuf.ProtoMember(1, Name = @"has_been_seen_in_log")]
672 | public bool HasBeenSeenInLog { get; set; }
673 |
674 | [global::ProtoBuf.ProtoMember(2, Name = @"echo_log_path")]
675 | [global::System.ComponentModel.DefaultValue("")]
676 | public string EchoLogPath { get; set; } = "";
677 |
678 | }
679 |
680 | [global::ProtoBuf.ProtoContract()]
681 | public partial class MapIDData : global::ProtoBuf.IExtensible
682 | {
683 | private global::ProtoBuf.IExtension __pbn__extensionData;
684 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
685 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
686 |
687 | [global::ProtoBuf.ProtoMember(1, Name = @"zone_name_id")]
688 | public uint ZoneNameId { get; set; }
689 |
690 | [global::ProtoBuf.ProtoMember(2, Name = @"map_name_id")]
691 | public uint MapNameId { get; set; }
692 |
693 | }
694 |
695 | [global::ProtoBuf.ProtoContract()]
696 | public partial class GameStateSaveData : global::ProtoBuf.IExtensible
697 | {
698 | private global::ProtoBuf.IExtension __pbn__extensionData;
699 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
700 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
701 |
702 | [global::ProtoBuf.ProtoMember(1, Name = @"last_traveled_map_id")]
703 | public MapIDData LastTraveledMapId { get; set; }
704 |
705 | [global::ProtoBuf.ProtoMember(2, Name = @"mayhem_level")]
706 | public int MayhemLevel { get; set; }
707 |
708 | }
709 |
710 | [global::ProtoBuf.ProtoContract()]
711 | public partial class ChallengeCategoryProgressSaveData : global::ProtoBuf.IExtensible
712 | {
713 | private global::ProtoBuf.IExtension __pbn__extensionData;
714 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
715 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
716 |
717 | [global::ProtoBuf.ProtoMember(1, Name = @"category_progress")]
718 | public byte[] CategoryProgress { get; set; }
719 |
720 | }
721 |
722 | [global::ProtoBuf.ProtoContract()]
723 | public partial class OakPlayerCharacterAugmentSaveGameData : global::ProtoBuf.IExtensible
724 | {
725 | private global::ProtoBuf.IExtension __pbn__extensionData;
726 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
727 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
728 |
729 | [global::ProtoBuf.ProtoMember(1, Name = @"slot_asset_path")]
730 | [global::System.ComponentModel.DefaultValue("")]
731 | public string SlotAssetPath { get; set; } = "";
732 |
733 | [global::ProtoBuf.ProtoMember(2, Name = @"augment_asset_path")]
734 | [global::System.ComponentModel.DefaultValue("")]
735 | public string AugmentAssetPath { get; set; } = "";
736 |
737 | }
738 |
739 | [global::ProtoBuf.ProtoContract()]
740 | public partial class OakPlayerCharacterSlotSaveGameData : global::ProtoBuf.IExtensible
741 | {
742 | private global::ProtoBuf.IExtension __pbn__extensionData;
743 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
744 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
745 |
746 | [global::ProtoBuf.ProtoMember(1, Name = @"augment_slot_list")]
747 | public global::System.Collections.Generic.List AugmentSlotLists { get; } = new global::System.Collections.Generic.List();
748 |
749 | }
750 |
751 | [global::ProtoBuf.ProtoContract()]
752 | public partial class UITrackingSaveGameData : global::ProtoBuf.IExtensible
753 | {
754 | private global::ProtoBuf.IExtension __pbn__extensionData;
755 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
756 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
757 |
758 | [global::ProtoBuf.ProtoMember(1, Name = @"has_seen_skill_menu_unlock")]
759 | public bool HasSeenSkillMenuUnlock { get; set; }
760 |
761 | [global::ProtoBuf.ProtoMember(2, Name = @"has_seen_guardian_rank_menu_unlock")]
762 | public bool HasSeenGuardianRankMenuUnlock { get; set; }
763 |
764 | [global::ProtoBuf.ProtoMember(3, Name = @"has_seen_echo_boot_ammo_bar")]
765 | public bool HasSeenEchoBootAmmoBar { get; set; }
766 |
767 | [global::ProtoBuf.ProtoMember(4, Name = @"has_seen_echo_boot_shield_bar")]
768 | public bool HasSeenEchoBootShieldBar { get; set; }
769 |
770 | [global::ProtoBuf.ProtoMember(5, Name = @"has_seen_echo_boot_grenades")]
771 | public bool HasSeenEchoBootGrenades { get; set; }
772 |
773 | [global::ProtoBuf.ProtoMember(6, Name = @"highest_thvm_breadcrumb_seen")]
774 | public int HighestThvmBreadcrumbSeen { get; set; }
775 |
776 | [global::ProtoBuf.ProtoMember(7, Name = @"inventory_slot_unlocks_seen")]
777 | public global::System.Collections.Generic.List InventorySlotUnlocksSeens { get; } = new global::System.Collections.Generic.List();
778 |
779 | [global::ProtoBuf.ProtoMember(8, Name = @"saved_spin_offset")]
780 | public int SavedSpinOffset { get; set; }
781 |
782 | }
783 |
784 | [global::ProtoBuf.ProtoContract()]
785 | public partial class PlanetCycleInfo : global::ProtoBuf.IExtensible
786 | {
787 | private global::ProtoBuf.IExtension __pbn__extensionData;
788 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
789 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
790 |
791 | [global::ProtoBuf.ProtoMember(1, Name = @"planet_name")]
792 | [global::System.ComponentModel.DefaultValue("")]
793 | public string PlanetName { get; set; } = "";
794 |
795 | [global::ProtoBuf.ProtoMember(2, Name = @"cycle_length")]
796 | public float CycleLength { get; set; }
797 |
798 | [global::ProtoBuf.ProtoMember(3, Name = @"last_cached_time")]
799 | public float LastCachedTime { get; set; }
800 |
801 | }
802 |
803 | [global::ProtoBuf.ProtoContract()]
804 | public partial class TimeOfDaySaveGameData : global::ProtoBuf.IExtensible
805 | {
806 | private global::ProtoBuf.IExtension __pbn__extensionData;
807 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
808 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
809 |
810 | [global::ProtoBuf.ProtoMember(1, Name = @"planet_cycle_info")]
811 | public global::System.Collections.Generic.List PlanetCycleInfoes { get; } = new global::System.Collections.Generic.List();
812 |
813 | [global::ProtoBuf.ProtoMember(2, Name = @"planet_cycle")]
814 | [global::System.ComponentModel.DefaultValue("")]
815 | public string PlanetCycle { get; set; } = "";
816 |
817 | }
818 |
819 | [global::ProtoBuf.ProtoContract(Name = @"LevelPersistence_Actor_SaveGameData")]
820 | public partial class LevelPersistenceActorSaveGameData : global::ProtoBuf.IExtensible
821 | {
822 | private global::ProtoBuf.IExtension __pbn__extensionData;
823 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
824 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
825 |
826 | [global::ProtoBuf.ProtoMember(1, Name = @"actor_name")]
827 | [global::System.ComponentModel.DefaultValue("")]
828 | public string ActorName { get; set; } = "";
829 |
830 | [global::ProtoBuf.ProtoMember(2, Name = @"timer_remaining")]
831 | public int TimerRemaining { get; set; }
832 |
833 | }
834 |
835 | [global::ProtoBuf.ProtoContract(Name = @"LevelPersistence_Level_SaveGameData")]
836 | public partial class LevelPersistenceLevelSaveGameData : global::ProtoBuf.IExtensible
837 | {
838 | private global::ProtoBuf.IExtension __pbn__extensionData;
839 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
840 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
841 |
842 | [global::ProtoBuf.ProtoMember(1, Name = @"level_name")]
843 | [global::System.ComponentModel.DefaultValue("")]
844 | public string LevelName { get; set; } = "";
845 |
846 | [global::ProtoBuf.ProtoMember(2, Name = @"saved_actors")]
847 | public global::System.Collections.Generic.List SavedActors { get; } = new global::System.Collections.Generic.List();
848 |
849 | }
850 |
851 | [global::ProtoBuf.ProtoContract()]
852 | public partial class GbxZoneMapFODSavedLevelData : global::ProtoBuf.IExtensible
853 | {
854 | private global::ProtoBuf.IExtension __pbn__extensionData;
855 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
856 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
857 |
858 | [global::ProtoBuf.ProtoMember(1, Name = @"level_name")]
859 | [global::System.ComponentModel.DefaultValue("")]
860 | public string LevelName { get; set; } = "";
861 |
862 | [global::ProtoBuf.ProtoMember(2, Name = @"fod_texture_size")]
863 | public uint FodTextureSize { get; set; }
864 |
865 | [global::ProtoBuf.ProtoMember(3, Name = @"num_chunks")]
866 | public uint NumChunks { get; set; }
867 |
868 | [global::ProtoBuf.ProtoMember(4, Name = @"discovery_percentage")]
869 | public float DiscoveryPercentage { get; set; }
870 |
871 | [global::ProtoBuf.ProtoMember(5, Name = @"data_state")]
872 | public uint DataState { get; set; }
873 |
874 | [global::ProtoBuf.ProtoMember(6, Name = @"data_revision")]
875 | public uint DataRevision { get; set; }
876 |
877 | [global::ProtoBuf.ProtoMember(7, Name = @"fod_data")]
878 | public byte[] FodData { get; set; }
879 |
880 | }
881 |
882 | [global::ProtoBuf.ProtoContract()]
883 | public partial class GbxZoneMapFODSaveGameData : global::ProtoBuf.IExtensible
884 | {
885 | private global::ProtoBuf.IExtension __pbn__extensionData;
886 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
887 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
888 |
889 | [global::ProtoBuf.ProtoMember(1, Name = @"level_data")]
890 | public global::System.Collections.Generic.List LevelDatas { get; } = new global::System.Collections.Generic.List();
891 |
892 | }
893 |
894 | [global::ProtoBuf.ProtoContract()]
895 | public partial class Character : global::ProtoBuf.IExtensible
896 | {
897 | private global::ProtoBuf.IExtension __pbn__extensionData;
898 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
899 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
900 |
901 | [global::ProtoBuf.ProtoMember(1, Name = @"save_game_id")]
902 | public uint SaveGameId { get; set; }
903 |
904 | [global::ProtoBuf.ProtoMember(2, Name = @"last_save_timestamp")]
905 | public long LastSaveTimestamp { get; set; }
906 |
907 | [global::ProtoBuf.ProtoMember(3, Name = @"time_played_seconds")]
908 | public uint TimePlayedSeconds { get; set; }
909 |
910 | [global::ProtoBuf.ProtoMember(4, Name = @"player_class_data")]
911 | public PlayerClassSaveGameData PlayerClassData { get; set; }
912 |
913 | [global::ProtoBuf.ProtoMember(5, Name = @"resource_pools")]
914 | public global::System.Collections.Generic.List ResourcePools { get; } = new global::System.Collections.Generic.List();
915 |
916 | [global::ProtoBuf.ProtoMember(6, Name = @"saved_regions")]
917 | public global::System.Collections.Generic.List SavedRegions { get; } = new global::System.Collections.Generic.List();
918 |
919 | [global::ProtoBuf.ProtoMember(7, Name = @"experience_points")]
920 | public int ExperiencePoints { get; set; }
921 |
922 | [global::ProtoBuf.ProtoMember(8, Name = @"game_stats_data")]
923 | public global::System.Collections.Generic.List GameStatsDatas { get; } = new global::System.Collections.Generic.List();
924 |
925 | [global::ProtoBuf.ProtoMember(9, Name = @"inventory_category_list")]
926 | public global::System.Collections.Generic.List InventoryCategoryLists { get; } = new global::System.Collections.Generic.List();
927 |
928 | [global::ProtoBuf.ProtoMember(10, Name = @"inventory_items")]
929 | public global::System.Collections.Generic.List InventoryItems { get; } = new global::System.Collections.Generic.List();
930 |
931 | [global::ProtoBuf.ProtoMember(11, Name = @"equipped_inventory_list")]
932 | public global::System.Collections.Generic.List EquippedInventoryLists { get; } = new global::System.Collections.Generic.List();
933 |
934 | [global::ProtoBuf.ProtoMember(12, Name = @"active_weapon_list", IsPacked = true)]
935 | public int[] ActiveWeaponLists { get; set; }
936 |
937 | [global::ProtoBuf.ProtoMember(13, Name = @"ability_data")]
938 | public OakPlayerAbilitySaveGameData AbilityData { get; set; }
939 |
940 | [global::ProtoBuf.ProtoMember(14, Name = @"last_play_through_index")]
941 | public int LastPlayThroughIndex { get; set; }
942 |
943 | [global::ProtoBuf.ProtoMember(15, Name = @"playthroughs_completed")]
944 | public int PlaythroughsCompleted { get; set; }
945 |
946 | [global::ProtoBuf.ProtoMember(16, Name = @"show_new_playthrough_notification")]
947 | public bool ShowNewPlaythroughNotification { get; set; }
948 |
949 | [global::ProtoBuf.ProtoMember(17, Name = @"mission_playthroughs_data")]
950 | public global::System.Collections.Generic.List MissionPlaythroughsDatas { get; } = new global::System.Collections.Generic.List();
951 |
952 | [global::ProtoBuf.ProtoMember(21, Name = @"active_travel_stations")]
953 | public global::System.Collections.Generic.List ActiveTravelStations { get; } = new global::System.Collections.Generic.List();
954 |
955 | [global::ProtoBuf.ProtoMember(22, Name = @"discovery_data")]
956 | public DiscoverySaveData DiscoveryData { get; set; }
957 |
958 | [global::ProtoBuf.ProtoMember(23, Name = @"last_active_travel_station")]
959 | [global::System.ComponentModel.DefaultValue("")]
960 | public string LastActiveTravelStation { get; set; } = "";
961 |
962 | [global::ProtoBuf.ProtoMember(24, Name = @"vehicles_unlocked_data")]
963 | public global::System.Collections.Generic.List VehiclesUnlockedDatas { get; } = new global::System.Collections.Generic.List();
964 |
965 | [global::ProtoBuf.ProtoMember(25, Name = @"vehicle_parts_unlocked")]
966 | public global::System.Collections.Generic.List VehiclePartsUnlockeds { get; } = new global::System.Collections.Generic.List();
967 |
968 | [global::ProtoBuf.ProtoMember(26, Name = @"vehicle_loadouts")]
969 | public global::System.Collections.Generic.List VehicleLoadouts { get; } = new global::System.Collections.Generic.List();
970 |
971 | [global::ProtoBuf.ProtoMember(27, Name = @"vehicle_last_loadout_index")]
972 | public int VehicleLastLoadoutIndex { get; set; }
973 |
974 | [global::ProtoBuf.ProtoMember(28, Name = @"challenge_data")]
975 | public global::System.Collections.Generic.List ChallengeDatas { get; } = new global::System.Collections.Generic.List();
976 |
977 | [global::ProtoBuf.ProtoMember(29, Name = @"sdu_list")]
978 | public global::System.Collections.Generic.List SduLists { get; } = new global::System.Collections.Generic.List();
979 |
980 | [global::ProtoBuf.ProtoMember(30, Name = @"selected_customizations")]
981 | public global::System.Collections.Generic.List SelectedCustomizations { get; } = new global::System.Collections.Generic.List();
982 |
983 | [global::ProtoBuf.ProtoMember(31, Name = @"equipped_emote_customizations", IsPacked = true)]
984 | public int[] EquippedEmoteCustomizations { get; set; }
985 |
986 | [global::ProtoBuf.ProtoMember(32, Name = @"selected_color_customizations")]
987 | public global::System.Collections.Generic.List SelectedColorCustomizations { get; } = new global::System.Collections.Generic.List();
988 |
989 | [global::ProtoBuf.ProtoMember(33, Name = @"guardian_rank")]
990 | public GuardianRankSaveGameData GuardianRank { get; set; }
991 |
992 | [global::ProtoBuf.ProtoMember(34, Name = @"crew_quarters_room")]
993 | public CrewQuartersSaveData CrewQuartersRoom { get; set; }
994 |
995 | [global::ProtoBuf.ProtoMember(35, Name = @"crew_quarters_gun_rack")]
996 | public CrewQuartersGunRackSaveData CrewQuartersGunRack { get; set; }
997 |
998 | [global::ProtoBuf.ProtoMember(36, Name = @"unlocked_echo_logs")]
999 | public global::System.Collections.Generic.List UnlockedEchoLogs { get; } = new global::System.Collections.Generic.List();
1000 |
1001 | [global::ProtoBuf.ProtoMember(37, Name = @"has_played_special_echo_log_insert_already")]
1002 | public bool HasPlayedSpecialEchoLogInsertAlready { get; set; }
1003 |
1004 | [global::ProtoBuf.ProtoMember(38, Name = @"nickname_mappings")]
1005 | public global::System.Collections.Generic.List NicknameMappings { get; } = new global::System.Collections.Generic.List();
1006 |
1007 | [global::ProtoBuf.ProtoMember(39, Name = @"last_traveled_map_id")]
1008 | public MapIDData LastTraveledMapId { get; set; }
1009 |
1010 | [global::ProtoBuf.ProtoMember(40, Name = @"challenge_category_completion_pcts")]
1011 | public ChallengeCategoryProgressSaveData ChallengeCategoryCompletionPcts { get; set; }
1012 |
1013 | [global::ProtoBuf.ProtoMember(41, Name = @"character_slot_save_game_data")]
1014 | public OakPlayerCharacterSlotSaveGameData CharacterSlotSaveGameData { get; set; }
1015 |
1016 | [global::ProtoBuf.ProtoMember(42, Name = @"ui_tracking_save_game_data")]
1017 | public UITrackingSaveGameData UiTrackingSaveGameData { get; set; }
1018 |
1019 | [global::ProtoBuf.ProtoMember(43, Name = @"preferred_character_name")]
1020 | [global::System.ComponentModel.DefaultValue("")]
1021 | public string PreferredCharacterName { get; set; } = "";
1022 |
1023 | [global::ProtoBuf.ProtoMember(44, Name = @"name_character_limit")]
1024 | public int NameCharacterLimit { get; set; }
1025 |
1026 | [global::ProtoBuf.ProtoMember(45, Name = @"preferred_group_mode")]
1027 | public uint PreferredGroupMode { get; set; }
1028 |
1029 | [global::ProtoBuf.ProtoMember(46, Name = @"time_of_day_save_game_data")]
1030 | public TimeOfDaySaveGameData TimeOfDaySaveGameData { get; set; }
1031 |
1032 | [global::ProtoBuf.ProtoMember(47, Name = @"level_persistence_data")]
1033 | public global::System.Collections.Generic.List LevelPersistenceDatas { get; } = new global::System.Collections.Generic.List();
1034 |
1035 | [global::ProtoBuf.ProtoMember(48, Name = @"accumulated_level_persistence_reset_timer_seconds")]
1036 | public uint AccumulatedLevelPersistenceResetTimerSeconds { get; set; }
1037 |
1038 | [global::ProtoBuf.ProtoMember(49, Name = @"mayhem_level")]
1039 | public uint MayhemLevel { get; set; }
1040 |
1041 | [global::ProtoBuf.ProtoMember(50, Name = @"gbx_zone_map_fod_save_game_data")]
1042 | public GbxZoneMapFODSaveGameData GbxZoneMapFodSaveGameData { get; set; }
1043 |
1044 | [global::ProtoBuf.ProtoMember(51, Name = @"active_or_blacklisted_travel_stations")]
1045 | public global::System.Collections.Generic.List ActiveOrBlacklistedTravelStations { get; } = new global::System.Collections.Generic.List();
1046 |
1047 | [global::ProtoBuf.ProtoMember(52, Name = @"last_active_travel_station_for_playthrough")]
1048 | public global::System.Collections.Generic.List LastActiveTravelStationForPlaythroughs { get; } = new global::System.Collections.Generic.List();
1049 |
1050 | [global::ProtoBuf.ProtoMember(53, Name = @"game_state_save_data_for_playthrough")]
1051 | public global::System.Collections.Generic.List GameStateSaveDataForPlaythroughs { get; } = new global::System.Collections.Generic.List();
1052 |
1053 | [global::ProtoBuf.ProtoMember(54, Name = @"registered_downloadable_entitlements")]
1054 | public global::System.Collections.Generic.List RegisteredDownloadableEntitlements { get; } = new global::System.Collections.Generic.List();
1055 |
1056 | [global::ProtoBuf.ProtoMember(55, Name = @"active_travel_stations_for_playthrough")]
1057 | public global::System.Collections.Generic.List ActiveTravelStationsForPlaythroughs { get; } = new global::System.Collections.Generic.List();
1058 |
1059 | [global::ProtoBuf.ProtoMember(56, Name = @"save_game_guid")]
1060 | [global::System.ComponentModel.DefaultValue("")]
1061 | public string SaveGameGuid { get; set; } = "";
1062 |
1063 | [global::ProtoBuf.ProtoMember(57, Name = @"guardian_rank_character_data")]
1064 | public GuardianRankCharacterSaveGameData GuardianRankCharacterData { get; set; }
1065 |
1066 | [global::ProtoBuf.ProtoMember(58, Name = @"optional_objective_reward_fixup_applied")]
1067 | public bool OptionalObjectiveRewardFixupApplied { get; set; }
1068 |
1069 | [global::ProtoBuf.ProtoMember(59, Name = @"vehicle_part_rewards_fixup_applied")]
1070 | public bool VehiclePartRewardsFixupApplied { get; set; }
1071 |
1072 | [global::ProtoBuf.ProtoContract()]
1073 | public partial class NicknameMappingsEntry : global::ProtoBuf.IExtensible
1074 | {
1075 | private global::ProtoBuf.IExtension __pbn__extensionData;
1076 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
1077 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
1078 |
1079 | [global::ProtoBuf.ProtoMember(1, Name = @"key")]
1080 | [global::System.ComponentModel.DefaultValue("")]
1081 | public string Key { get; set; } = "";
1082 |
1083 | [global::ProtoBuf.ProtoMember(2, Name = @"value")]
1084 | [global::System.ComponentModel.DefaultValue("")]
1085 | public string Value { get; set; } = "";
1086 |
1087 | }
1088 |
1089 | }
1090 |
1091 | }
1092 |
1093 | #pragma warning restore CS0612, CS1591, CS3021, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
1094 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/Definitions/OakShared.cs:
--------------------------------------------------------------------------------
1 | // This file was generated by a tool; you should avoid making direct changes.
2 | // Consider using 'partial classes' to extend these types
3 | // Input: OakShared.proto
4 |
5 | #pragma warning disable CS0612, CS1591, CS3021, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
6 | namespace OakSave
7 | {
8 |
9 | [global::ProtoBuf.ProtoContract()]
10 | public partial class Vec3 : global::ProtoBuf.IExtensible
11 | {
12 | private global::ProtoBuf.IExtension __pbn__extensionData;
13 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
14 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
15 |
16 | [global::ProtoBuf.ProtoMember(1, Name = @"x")]
17 | public float X { get; set; }
18 |
19 | [global::ProtoBuf.ProtoMember(2, Name = @"y")]
20 | public float Y { get; set; }
21 |
22 | [global::ProtoBuf.ProtoMember(3, Name = @"z")]
23 | public float Z { get; set; }
24 |
25 | }
26 |
27 | [global::ProtoBuf.ProtoContract()]
28 | public partial class GameStatSaveGameData : global::ProtoBuf.IExtensible
29 | {
30 | private global::ProtoBuf.IExtension __pbn__extensionData;
31 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
32 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
33 |
34 | [global::ProtoBuf.ProtoMember(1, Name = @"stat_value")]
35 | public int StatValue { get; set; }
36 |
37 | [global::ProtoBuf.ProtoMember(2, Name = @"stat_path")]
38 | [global::System.ComponentModel.DefaultValue("")]
39 | public string StatPath { get; set; } = "";
40 |
41 | }
42 |
43 | [global::ProtoBuf.ProtoContract()]
44 | public partial class InventoryCategorySaveData : global::ProtoBuf.IExtensible
45 | {
46 | private global::ProtoBuf.IExtension __pbn__extensionData;
47 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
48 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
49 |
50 | [global::ProtoBuf.ProtoMember(1, Name = @"base_category_definition_hash")]
51 | public uint BaseCategoryDefinitionHash { get; set; }
52 |
53 | [global::ProtoBuf.ProtoMember(2, Name = @"quantity")]
54 | public int Quantity { get; set; }
55 |
56 | }
57 |
58 | [global::ProtoBuf.ProtoContract()]
59 | public partial class OakSDUSaveGameData : global::ProtoBuf.IExtensible
60 | {
61 | private global::ProtoBuf.IExtension __pbn__extensionData;
62 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
63 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
64 |
65 | [global::ProtoBuf.ProtoMember(1, Name = @"sdu_level")]
66 | public int SduLevel { get; set; }
67 |
68 | [global::ProtoBuf.ProtoMember(2, Name = @"sdu_data_path")]
69 | [global::System.ComponentModel.DefaultValue("")]
70 | public string SduDataPath { get; set; } = "";
71 |
72 | }
73 |
74 | [global::ProtoBuf.ProtoContract()]
75 | public partial class RegisteredDownloadableEntitlement : global::ProtoBuf.IExtensible
76 | {
77 | private global::ProtoBuf.IExtension __pbn__extensionData;
78 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
79 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
80 |
81 | [global::ProtoBuf.ProtoMember(1, Name = @"id")]
82 | public int Id { get; set; }
83 |
84 | [global::ProtoBuf.ProtoMember(2, Name = @"consumed")]
85 | public uint Consumed { get; set; }
86 |
87 | [global::ProtoBuf.ProtoMember(3, Name = @"registered")]
88 | public bool Registered { get; set; }
89 |
90 | [global::ProtoBuf.ProtoMember(4, Name = @"seen")]
91 | public bool Seen { get; set; }
92 |
93 | }
94 |
95 | [global::ProtoBuf.ProtoContract()]
96 | public partial class RegisteredDownloadableEntitlements : global::ProtoBuf.IExtensible
97 | {
98 | private global::ProtoBuf.IExtension __pbn__extensionData;
99 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
100 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
101 |
102 | [global::ProtoBuf.ProtoMember(1, Name = @"entitlement_source_asset_path")]
103 | [global::System.ComponentModel.DefaultValue("")]
104 | public string EntitlementSourceAssetPath { get; set; } = "";
105 |
106 | [global::ProtoBuf.ProtoMember(2, Name = @"entitlement_ids", IsPacked = true)]
107 | public long[] EntitlementIds { get; set; }
108 |
109 | [global::ProtoBuf.ProtoMember(3, Name = @"entitlements")]
110 | public global::System.Collections.Generic.List Entitlements { get; } = new global::System.Collections.Generic.List();
111 |
112 | }
113 |
114 | [global::ProtoBuf.ProtoContract()]
115 | public partial class ChallengeStatSaveGameData : global::ProtoBuf.IExtensible
116 | {
117 | private global::ProtoBuf.IExtension __pbn__extensionData;
118 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
119 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
120 |
121 | [global::ProtoBuf.ProtoMember(1, Name = @"current_stat_value")]
122 | public int CurrentStatValue { get; set; }
123 |
124 | [global::ProtoBuf.ProtoMember(2, Name = @"challenge_stat_path")]
125 | [global::System.ComponentModel.DefaultValue("")]
126 | public string ChallengeStatPath { get; set; } = "";
127 |
128 | }
129 |
130 | [global::ProtoBuf.ProtoContract()]
131 | public partial class OakChallengeRewardSaveGameData : global::ProtoBuf.IExtensible
132 | {
133 | private global::ProtoBuf.IExtension __pbn__extensionData;
134 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
135 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
136 |
137 | [global::ProtoBuf.ProtoMember(1, Name = @"challenge_reward_claimed")]
138 | public bool ChallengeRewardClaimed { get; set; }
139 |
140 | }
141 |
142 | [global::ProtoBuf.ProtoContract()]
143 | public partial class ChallengeSaveGameData : global::ProtoBuf.IExtensible
144 | {
145 | private global::ProtoBuf.IExtension __pbn__extensionData;
146 | global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
147 | => global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
148 |
149 | [global::ProtoBuf.ProtoMember(1, Name = @"completed_count")]
150 | public int CompletedCount { get; set; }
151 |
152 | [global::ProtoBuf.ProtoMember(2, Name = @"is_active")]
153 | public bool IsActive { get; set; }
154 |
155 | [global::ProtoBuf.ProtoMember(3, Name = @"currently_completed")]
156 | public bool CurrentlyCompleted { get; set; }
157 |
158 | [global::ProtoBuf.ProtoMember(4, Name = @"completed_progress_level")]
159 | public int CompletedProgressLevel { get; set; }
160 |
161 | [global::ProtoBuf.ProtoMember(5, Name = @"progress_counter")]
162 | public int ProgressCounter { get; set; }
163 |
164 | [global::ProtoBuf.ProtoMember(6, Name = @"stat_instance_state")]
165 | public global::System.Collections.Generic.List StatInstanceStates { get; } = new global::System.Collections.Generic.List();
166 |
167 | [global::ProtoBuf.ProtoMember(7, Name = @"challenge_class_path")]
168 | [global::System.ComponentModel.DefaultValue("")]
169 | public string ChallengeClassPath { get; set; } = "";
170 |
171 | [global::ProtoBuf.ProtoMember(8, Name = @"challenge_reward_info")]
172 | public global::System.Collections.Generic.List ChallengeRewardInfoes { get; } = new global::System.Collections.Generic.List();
173 |
174 | }
175 |
176 | }
177 |
178 | #pragma warning restore CS0612, CS1591, CS3021, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
179 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/GVAS/GVASData.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using PackageIO;
3 | using System.Text;
4 | using System.Collections.Generic;
5 |
6 | namespace BL3ProfileEditor.Protobufs.GVAS
7 | {
8 | public class GVASSave
9 | {
10 | public int sg { get; set; }
11 | public int pkg { get; set; }
12 | public short mj { get; set; }
13 | public short mn { get; set; }
14 | public short pa { get; set; }
15 | public uint eng { get; set; }
16 | public string build { get; set; }
17 | public int fmt { get; set; }
18 | public int fmtLength { get; set; }
19 | public Dictionary fmtData { get; set; }
20 | public string sgType { get; set; }
21 |
22 | public GVASSave(int sg, int pkg, short mj, short mn, short pa, uint eng, string build, int fmt, int fmtlength, Dictionary fmtData, string sgType)
23 | {
24 | this.sg = sg;
25 | this.pkg = pkg;
26 | this.mj = mj;
27 | this.mn = mn;
28 | this.pa = pa;
29 | this.eng = eng;
30 | this.build = build;
31 | this.fmt = fmt;
32 | this.fmtLength = fmtlength;
33 | this.fmtData = fmtData;
34 | this.sgType = sgType;
35 | }
36 | }
37 |
38 | public static partial class Helpers
39 | {
40 | private static readonly Encoding Utf8 = new UTF8Encoding(false);
41 |
42 | #region Reading/Writing UE Strings
43 |
44 | public static string ReadUEString(this IO io)
45 | {
46 | if (io.PeekChar() < 0) return null;
47 | int length = io.ReadInt32();
48 | if (length == 0) return null;
49 | if (length == 1) return "";
50 | var valueBytes = io.ReadBytes(length);
51 | return Utf8.GetString(valueBytes, 0, valueBytes.Length - 1);
52 | }
53 |
54 | public static void WriteUEString(this IO io, string str)
55 | {
56 | if (str == null) io.WriteInt32(0);
57 | else if (string.Empty.Equals(str)) io.WriteInt32(1);
58 | else
59 | {
60 | byte[] data = Utf8.GetBytes(str + '\0');
61 | io.WriteInt32(data.Length);
62 | io.WriteBytes(data);
63 | }
64 | }
65 |
66 | #endregion
67 |
68 | #region Reading/Writing GVAS Format
69 |
70 | public static GVASSave ReadGVASSave(IO io)
71 | {
72 | string header = io.ReadASCII(4);
73 | if (!header.Equals("GVAS")) return null;
74 | Console.WriteLine("Header: {0}", header);
75 | int sgVersion = io.ReadInt32();
76 | Console.WriteLine("Save Game Version: {0}", sgVersion);
77 | int pkgVersion = io.ReadInt32();
78 | Console.WriteLine("Package version: {0}", pkgVersion);
79 | short major = io.ReadInt16();
80 | short minor = io.ReadInt16();
81 | short patch = io.ReadInt16();
82 | uint engineBuild = io.ReadUInt32();
83 | Console.WriteLine("Engine version: {0}.{1}.{2}.{3}", major, minor, patch, engineBuild);
84 |
85 | string buildId = ReadUEString(io);
86 | Console.WriteLine("Build ID: {0}", buildId);
87 |
88 | int fmtVersion = io.ReadInt32();
89 | Console.WriteLine("Custom Format Version: {0}", fmtVersion);
90 | int fmtCount = io.ReadInt32();
91 | Console.WriteLine("Custom Format Data Count: {0}", fmtCount);
92 | Dictionary keyValuePairs = new Dictionary();
93 | for (int i = 0; i < fmtCount; i++)
94 | {
95 | byte[] guid = io.ReadBytes(16);
96 | int entry = io.ReadInt32();
97 | keyValuePairs.Add(guid, entry);
98 | }
99 |
100 | string sgType = ReadUEString(io);
101 | Console.WriteLine("Save Game Type: {0}", sgType);
102 | GVASSave saveData = new GVASSave(sgVersion, pkgVersion, major, minor, patch, engineBuild, buildId, fmtVersion, fmtCount, keyValuePairs, sgType);
103 |
104 | return saveData;
105 | }
106 |
107 | public static void WriteGVASSave(IO io, GVASSave saveData)
108 | {
109 | io.WriteASCII("GVAS");
110 | io.WriteInt32(saveData.sg);
111 | io.WriteInt32(saveData.pkg);
112 | io.WriteInt16(saveData.mj);
113 | io.WriteInt16(saveData.mn);
114 | io.WriteInt16(saveData.pa);
115 | io.WriteUInt32(saveData.eng);
116 | io.WriteUEString(saveData.build);
117 | io.WriteInt32(saveData.fmt);
118 | io.WriteInt32(saveData.fmtLength);
119 | foreach (KeyValuePair entry in saveData.fmtData)
120 | {
121 | io.WriteBytes(entry.Key);
122 | io.WriteInt32(entry.Value);
123 | }
124 | io.WriteUEString(saveData.sgType);
125 | }
126 | #endregion
127 | }
128 | }
129 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/Helpers/Helpers.cs:
--------------------------------------------------------------------------------
1 | namespace BL3ProfileEditor.Protobufs.Helpers
2 | {
3 | public class StringIntPair
4 | {
5 | public string str { get; set; } = "";
6 | public double Value { get; set; } = 0;
7 | public StringIntPair(string name, int val)
8 | {
9 | str = name;
10 | Value = val;
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/OakProfile.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 | package OakSave;
3 | import "OakShared.proto";
4 | message PlayerInputBinding_Button {
5 | string rebind_data_path = 1;
6 | repeated string key_names = 2;
7 | }
8 | message PlayerInputBinding_Axis_Key {
9 | string key_name = 1;
10 | Vec3 scale_3d = 2;
11 | }
12 | message PlayerInputBinding_Axis {
13 | string rebind_data_path = 1;
14 | repeated PlayerInputBinding_Axis_Key keys = 2;
15 | }
16 | message PlayerInputBinding_Category {
17 | string category_data_path = 1;
18 | string context_data_path = 2;
19 | repeated PlayerInputBinding_Button button_bindings = 3;
20 | repeated PlayerInputBinding_Axis axis_bindings = 4;
21 | }
22 | message PlayerInputBindings {
23 | repeated PlayerInputBinding_Category categories = 1;
24 | }
25 | message OakProfileLastInventoryFilterInfo {
26 | string slot_type_id = 1;
27 | int32 last_filter_index = 2;
28 | }
29 | message OakProfileMenuTutorialInfo {
30 | repeated string seen_tutorials = 1;
31 | bool tutorials_disabled = 2;
32 | bool tutorials_allowed_in_non_game_modes = 3;
33 | }
34 | message OakFriendEncounterData {
35 | uint32 num_encounters = 1;
36 | int64 time_last_encounter = 2;
37 | }
38 | message OakMailItem {
39 | uint32 mail_item_type = 1;
40 | string sender_display_name = 2;
41 | string subject = 3;
42 | string body = 4;
43 | string gear_serial_number = 5;
44 | string mail_guid = 6;
45 | int64 date_sent = 7;
46 | int64 expiration_date = 8;
47 | string from_player_id = 9;
48 | bool has_been_read = 10;
49 | }
50 | message GearSoldByFriendData {
51 | string gear_serial_number = 1;
52 | int32 player_class_identifier_hash = 2;
53 | string friend_net_id = 3;
54 | }
55 | message OakCustomizationSaveGameData {
56 | bool is_new = 1;
57 | string customization_asset_path = 2;
58 | }
59 | message OakInventoryCustomizationPartInfo {
60 | uint32 customization_part_hash = 1;
61 | bool is_new = 2;
62 | }
63 | message GuardianRankRewardSaveGameData {
64 | int32 num_tokens = 1;
65 | string reward_data_path = 2;
66 | }
67 | message GuardianRankProfileData {
68 | int32 available_tokens = 1;
69 | repeated GuardianRankRewardSaveGameData rank_rewards = 2;
70 | int32 guardian_rank = 3;
71 | int32 guardian_experience = 4;
72 | int32 guardian_reward_random_seed = 5;
73 | int64 new_guardian_experience = 6;
74 | }
75 | message CrewQuartersDecorationItemSaveGameData {
76 | bool is_new = 1;
77 | string decoration_item_asset_path = 2;
78 | }
79 | message CrewQuartersRoomItemSaveGameData {
80 | bool is_new = 1;
81 | string room_item_asset_path = 2;
82 | }
83 | message RecentlyMetPlayer {
84 | string shift_player_id = 1;
85 | string first_party_player_id = 2;
86 | bool show_shift_player_entry = 3;
87 | }
88 | message Profile {
89 | message FriendEncountersEntry {
90 | string key = 1;
91 | OakFriendEncounterData value = 2;
92 | }
93 | bool enable_aim_assist = 1;
94 | bool gamepad_invert_look = 2;
95 | bool gamepad_invert_turn = 3;
96 | bool gamepad_invert_move = 4;
97 | bool gamepad_invert_strafe = 5;
98 | bool enable_vibration = 6;
99 | bool invert_mouse_pitch = 7;
100 | bool enable_mouse_smoothing = 8;
101 | float mouse_scale = 9;
102 | bool show_damage_numbers = 10;
103 | bool show_damage_number_icons = 11;
104 | bool enable_training_messages = 12;
105 | bool show_text_chat = 13;
106 | bool center_crosshair = 14;
107 | bool toggle_sprint = 15;
108 | bool toggle_crouch = 16;
109 | bool censor_content = 17;
110 | float music_volume = 18;
111 | float sound_effects_volume = 19;
112 | float vo_volume = 20;
113 | float voice_volume = 21;
114 | bool enable_optional_vo = 22;
115 | bool push_to_talk = 23;
116 | bool enable_controller_audio = 24;
117 | float speaker_angle_front = 25;
118 | float speaker_angle_side = 26;
119 | float speaker_angle_back = 27;
120 | uint32 speaker_setup = 28;
121 | bool mute_audio_on_focus_loss = 29;
122 | bool hide_strict_nat_help_dialog = 34;
123 | PlayerInputBindings player_input_bindings = 35;
124 | repeated uint32 news_hashes = 36;
125 | uint32 last_used_savegame_id = 37;
126 | int32 gamepad_hip_sensitivity_level = 38;
127 | int32 gamepad_zoomed_sensitivity_level = 39;
128 | int32 gamepad_vehicle_sensitivity_level = 40;
129 | float gamepad_movement_dead_zone_x = 41;
130 | float gamepad_movement_dead_zone_y = 42;
131 | float gamepad_look_dead_zone_inner_x = 43;
132 | float gamepad_look_dead_zone_outer_x = 44;
133 | float gamepad_look_dead_zone_inner_y = 45;
134 | float gamepad_look_dead_zone_outer_y = 46;
135 | float gamepad_vehicle_movement_dead_zone_x = 47;
136 | float gamepad_vehicle_movement_dead_zone_y = 48;
137 | float gamepad_vehicle_look_dead_zone_inner_x = 49;
138 | float gamepad_vehicle_look_dead_zone_outer_x = 50;
139 | float gamepad_vehicle_look_dead_zone_inner_y = 51;
140 | float gamepad_vehicle_look_dead_zone_outer_y = 52;
141 | float gamepad_left_dead_zone_inner = 53;
142 | float gamepad_left_dead_zone_outer = 54;
143 | float gamepad_right_dead_zone_inner = 55;
144 | float gamepad_right_dead_zone_outer = 56;
145 | float gamepad_look_axial_dead_zone_scale = 57;
146 | float gamepad_move_axial_dead_zone_scale = 58;
147 | bool gamepad_use_advanced_hip_aim_settings = 59;
148 | bool gamepad_use_advanced_zoomed_aim_settings = 60;
149 | bool gamepad_use_advanced_vehicle_aim_settings = 61;
150 | float gamepad_hip_yaw_rate = 62;
151 | float gamepad_hip_pitch_rate = 63;
152 | float gamepad_hip_extra_yaw = 64;
153 | float gamepad_hip_extra_pitch = 65;
154 | float gamepad_hip_ramp_up_time = 66;
155 | float gamepad_hip_ramp_up_delay = 67;
156 | float gamepad_zoomed_yaw_rate = 68;
157 | float gamepad_zoomed_pitch_rate = 69;
158 | float gamepad_zoomed_extra_yaw = 70;
159 | float gamepad_zoomed_extra_pitch = 71;
160 | float gamepad_zoomed_ramp_up_time = 72;
161 | float gamepad_zoomed_ramp_up_delay = 73;
162 | float gamepad_vehicle_yaw_rate = 74;
163 | float gamepad_vehicle_pitch_rate = 75;
164 | float gamepad_vehicle_extra_yaw = 76;
165 | float gamepad_vehicle_extra_pitch = 77;
166 | float gamepad_vehicle_ramp_up_time = 78;
167 | float gamepad_vehicle_ramp_up_delay = 79;
168 | bool ironsight_aim_assist = 80;
169 | uint32 walking_joystick_scheme = 81;
170 | uint32 driving_joystick_scheme = 82;
171 | float mouse_ads_scale = 83;
172 | float mouse_vehicle_scale = 84;
173 | bool mouse_ironsight_aim_assist = 85;
174 | uint32 vehicle_input_mode = 86;
175 | bool weapon_aim_toggle = 87;
176 | bool mantle_requires_button = 88;
177 | bool fixed_minimap_rotation = 89;
178 | bool map_invert_pitch = 90;
179 | bool map_invert_yaw = 91;
180 | uint32 difficulty = 92;
181 | bool swap_dual_wield_controls = 93;
182 | float base_fov = 94;
183 | uint32 crosshair_neutral_color_frame = 95;
184 | uint32 crosshair_enemy_color_frame = 96;
185 | uint32 crosshair_ally_color_frame = 97;
186 | bool enable_subtitles = 98;
187 | bool enable_closed_captions = 99;
188 | string last_status_menu_page = 100;
189 | repeated OakProfileLastInventoryFilterInfo inventory_screen_last_filter = 101;
190 | OakProfileMenuTutorialInfo tutorial_info = 102;
191 | uint32 default_network_type = 103;
192 | uint32 default_invite_type = 104;
193 | string matchmaking_region = 105;
194 | uint32 streaming_service = 106;
195 | int32 max_cached_friend_events = 107;
196 | int32 max_cached_friend_statuses = 108;
197 | repeated string friend_events = 109;
198 | repeated string friend_statuses = 110;
199 | int64 last_whisper_fetch_events_time = 111;
200 | int64 last_whisper_fetch_statuses_time = 112;
201 | uint32 desired_crossplay_state = 113;
202 | repeated FriendEncountersEntry friend_encounters = 133;
203 | int32 max_friend_encounter_size = 134;
204 | repeated GameStatSaveGameData profile_stats_data = 135;
205 | repeated InventoryCategorySaveData bank_inventory_category_list = 136;
206 | repeated bytes bank_inventory_list = 137;
207 | repeated bytes lost_loot_inventory_list = 138;
208 | repeated OakMailItem npc_mail_items = 139;
209 | repeated string mail_guids = 140;
210 | repeated string unread_mail_guids = 141;
211 | repeated GearSoldByFriendData gear_sold_by_friends = 142;
212 | repeated OakSDUSaveGameData profile_sdu_list = 143;
213 | repeated OakCustomizationSaveGameData unlocked_customizations = 144;
214 | repeated OakInventoryCustomizationPartInfo unlocked_inventory_customization_parts = 145;
215 | GuardianRankProfileData guardian_rank = 146;
216 | repeated CrewQuartersDecorationItemSaveGameData unlocked_crew_quarters_decorations = 147;
217 | repeated CrewQuartersRoomItemSaveGameData unlocked_crew_quarters_rooms = 148;
218 | bool enable_mouse_acceleration = 150;
219 | bool enable_gamepad_input = 151;
220 | bool use_classic_gamepad_input = 152;
221 | float master_volume = 153;
222 | uint32 monitor_display_type = 154;
223 | uint32 graphics_mode = 155;
224 | uint32 frame_rate_limit = 156;
225 | float base_vehicle_fov = 157;
226 | uint32 graphics_quality = 158;
227 | uint32 anisotropic_filtering = 159;
228 | uint32 shadow_quality = 160;
229 | uint32 display_performance_stats = 161;
230 | uint32 texture_detail = 162;
231 | uint32 draw_distance = 163;
232 | uint32 clutter = 164;
233 | uint32 tessellation = 165;
234 | uint32 foliage = 166;
235 | bool foliage_shadows = 167;
236 | bool planar_reflections = 168;
237 | uint32 volumetric_fog = 169;
238 | uint32 screen_space_reflections = 170;
239 | uint32 character_texture_detail = 171;
240 | uint32 character_detail = 172;
241 | uint32 ambient_occlusion_quality = 173;
242 | bool object_motion_blur = 174;
243 | bool lens_flare = 175;
244 | bool combat_number_long_format = 176;
245 | bool show_minimap_legendaries = 177;
246 | bool use_player_callouts = 178;
247 | uint32 friend_event_notification_lifetime = 179;
248 | uint32 friend_event_notification_frequency = 180;
249 | uint32 trade_request_reception_type = 181;
250 | float head_bob_scale = 182;
251 | bool has_seen_first_boot = 184;
252 | float subs_cc_size = 189;
253 | float cc_subs_background_opacity = 190;
254 | uint32 walking_button_scheme = 191;
255 | uint32 driving_button_scheme = 192;
256 | uint32 glyph_mode = 193;
257 | bool use_MPH = 194;
258 | repeated RegisteredDownloadableEntitlements registered_downloadable_entitlements = 195;
259 | repeated string seen_news_items = 196;
260 | bool auto_centering_enabled = 197;
261 | bool increased_chance_for_subscribers = 198;
262 | bool rare_chest_event_enabled = 199;
263 | bool badass_event_enabled = 200;
264 | bool pinata_event_enabled = 201;
265 | int32 min_time_between_badass_events = 202;
266 | float hud_scale_multiplier = 203;
267 | bool disable_spatial_audio = 204;
268 | int32 total_playtime_seconds = 205;
269 | bool moxxis_drink_event_enabled = 206;
270 | int32 moxxis_drink_event_bits_product_id = 207;
271 | repeated ChallengeSaveGameData challenge_data = 208;
272 | repeated int32 CitizenScienceLevelProgression = 209;
273 | bool disable_event_content = 211;
274 | uint32 desired_friend_sync_state = 212;
275 | bool needs_shift_first_boot = 213;
276 | repeated RecentlyMetPlayer recently_met_players = 214;
277 | int32 CitizenScienceActiveBoosterIndex = 215;
278 | float CitizenScienceActiveBoosterRemainingTime = 216;
279 | float CitizenScienceActiveBoosterTotalTime = 217;
280 | int32 StreamerPrimaryActiveBoosterIndex = 218;
281 | float StreamerPrimaryActiveBoosterRemainingTime = 219;
282 | float StreamerPrimaryActiveBoosterTotalTime = 220;
283 | int32 StreamerSecondaryActiveBoosterIndex = 221;
284 | float StreamerSecondaryActiveBoosterRemainingTime = 222;
285 | float StreamerSecondaryActiveBoosterTotalTime = 223;
286 | int32 StreamerBoosterTier = 224;
287 | int32 CitizenScienceCSBucksAmount = 226;
288 | bool bCitizenScienceHasSeenIntroVideo = 227;
289 | bool bCitizenScienceTutorialDone = 228;
290 | bool fixed_initial_zonemap_rotation = 230;
291 | }
292 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/OakSave.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 | package OakSave;
3 | import "OakShared.proto";
4 | message PlayerClassSaveGameData {
5 | string player_class_path = 1;
6 | uint32 dlc_package_id = 2;
7 | }
8 | message ResourcePoolSavegameData {
9 | float amount = 1;
10 | string resource_path = 2;
11 | }
12 | message RegionSaveGameData {
13 | int32 game_stage = 1;
14 | int32 play_through_idx = 2;
15 | string region_path = 3;
16 | uint32 dlc_package_id = 4;
17 | }
18 | message InventoryBalanceStateInitializationData {
19 | int32 game_stage = 1;
20 | string inventory_data = 2;
21 | string inventory_balance_data = 3;
22 | string manufacturer_data = 4;
23 | repeated string part_list = 5;
24 | repeated string generic_part_list = 6;
25 | bytes additional_data = 7;
26 | repeated string customization_part_list = 8;
27 | }
28 | message OakInventoryItemSaveGameData {
29 | bytes item_serial_number = 1;
30 | int32 pickup_order_index = 2;
31 | int32 flags = 3;
32 | string weapon_skin_path = 4;
33 | InventoryBalanceStateInitializationData development_save_data = 5;
34 | }
35 | message EquippedInventorySaveGameData {
36 | int32 inventory_list_index = 1;
37 | bool enabled = 2;
38 | string slot_data_path = 3;
39 | string trinket_data_path = 4;
40 | }
41 | message OakAbilityTreeItemSaveGameData {
42 | string item_asset_path = 1;
43 | int32 points = 2;
44 | int32 max_points = 3;
45 | int32 tree_identifier = 4;
46 | }
47 | message OakAbilitySlotSaveGameData {
48 | string ability_class_path = 1;
49 | string slot_asset_path = 2;
50 | }
51 | message OakActionAbilityAugmentSaveGameData {
52 | string action_ability_class_path = 1;
53 | string slot_asset_path = 2;
54 | string augment_asset_path = 3;
55 | }
56 | message OakActionAbilityAugmentConfigurationSaveGameData {
57 | string ability_class_path = 1;
58 | string augment_asset_path = 2;
59 | string mod_slot_asset_path = 3;
60 | string mod_asset_path = 4;
61 | }
62 | message OakPlayerAbilitySaveGameData {
63 | int32 ability_points = 1;
64 | repeated OakAbilityTreeItemSaveGameData tree_item_list = 2;
65 | repeated OakAbilitySlotSaveGameData ability_slot_list = 3;
66 | repeated OakActionAbilityAugmentSaveGameData augment_slot_list = 4;
67 | repeated OakActionAbilityAugmentConfigurationSaveGameData augment_configuration_list = 5;
68 | int32 tree_grade = 6;
69 | }
70 | message MissionStatusPlayerSaveGameData {
71 | enum MissionState {
72 | MS_NotStarted = 0;
73 | MS_Active = 1;
74 | MS_Complete = 2;
75 | MS_Failed = 3;
76 | MS_Unknown = 4;
77 | }
78 | MissionState status = 1;
79 | bool has_been_viewed_in_log = 2;
80 | repeated int32 objectives_progress = 3;
81 | string mission_class_path = 4;
82 | string active_objective_set_path = 5;
83 | uint32 dlc_package_id = 6;
84 | bool kickoff_played = 7;
85 | uint32 league_instance = 8;
86 | }
87 | message MissionPlaythroughSaveGameData {
88 | repeated MissionStatusPlayerSaveGameData mission_list = 1;
89 | string tracked_mission_class_path = 2;
90 | }
91 | message ActiveFastTravelSaveData {
92 | string active_travel_station_name = 1;
93 | bool blacklisted = 2;
94 | }
95 | message PlaythroughActiveFastTravelSaveData {
96 | repeated ActiveFastTravelSaveData active_travel_stations = 1;
97 | }
98 | message DiscoveredAreaInfo {
99 | string discovered_area_name = 1;
100 | uint32 discovered_playthroughs = 2;
101 | }
102 | message DiscoveredLevelInfo {
103 | string discovered_level_name = 1;
104 | uint32 discovered_playthroughs = 3;
105 | repeated DiscoveredAreaInfo discovered_area_info = 4;
106 | }
107 | message DiscoveredPlanetInfo {
108 | string discovered_planet = 1;
109 | bool is_new_planet = 2;
110 | }
111 | message DiscoverySaveData {
112 | repeated DiscoveredLevelInfo discovered_level_info = 1;
113 | }
114 | message VehicleUnlockedSaveGameData {
115 | string asset_path = 1;
116 | bool just_unlocked = 2;
117 | }
118 | message OakCARMenuVehicleConfigSaveData {
119 | string loadout_save_name = 1;
120 | string body_asset_path = 2;
121 | string wheel_asset_path = 3;
122 | string armor_asset_path = 4;
123 | string core_mod_asset_path = 5;
124 | string gunner_weapon_asset_path = 6;
125 | string driver_weapon_asset_path = 7;
126 | string ornament_asset_path = 8;
127 | string material_decal_asset_path = 9;
128 | string material_asset_path = 10;
129 | int32 color_index_1 = 11;
130 | int32 color_index_2 = 12;
131 | int32 color_index_3 = 13;
132 | }
133 | message CustomPlayerColorSaveGameData {
134 | string color_parameter = 1;
135 | Vec3 applied_color = 2;
136 | Vec3 split_color = 3;
137 | bool use_default_color = 4;
138 | bool use_default_split_color = 5;
139 | }
140 | message GuardianRankSaveGameData {
141 | int32 guardian_rank = 1;
142 | int32 guardian_experience = 2;
143 | }
144 | message GuardianRankRewardCharacterSaveGameData {
145 | int32 num_tokens = 1;
146 | bool is_enabled = 2;
147 | string reward_data_path = 3;
148 | }
149 | message GuardianRankPerkCharacterSaveGameData {
150 | bool is_enabled = 1;
151 | string perk_data_path = 2;
152 | }
153 | message GuardianRankCharacterSaveGameData {
154 | int32 guardian_available_tokens = 1;
155 | int32 guardian_rank = 2;
156 | int32 guardian_experience = 3;
157 | repeated GuardianRankRewardCharacterSaveGameData rank_rewards = 4;
158 | repeated GuardianRankPerkCharacterSaveGameData rank_perks = 5;
159 | int32 guardian_reward_random_seed = 6;
160 | int64 new_guardian_experience = 7;
161 | bool is_rank_system_enabled = 8;
162 | }
163 | message CrewQuartersDecorationSaveData {
164 | int32 decoration_index = 1;
165 | string decoration_data_path = 2;
166 | }
167 | message CrewQuartersSaveData {
168 | int32 preferred_room_assignment = 1;
169 | repeated CrewQuartersDecorationSaveData decorations = 2;
170 | string room_data_path = 3;
171 | }
172 | message CrewQuartersGunRackItemSaveData {
173 | bytes encrypted_serial_number = 1;
174 | string slot_asset_path = 2;
175 | InventoryBalanceStateInitializationData development_save_data = 3;
176 | }
177 | message CrewQuartersGunRackSaveData {
178 | repeated CrewQuartersGunRackItemSaveData rack_save_data = 1;
179 | }
180 | message EchoLogSaveGameData {
181 | bool has_been_seen_in_log = 1;
182 | string echo_log_path = 2;
183 | }
184 | message MapIDData {
185 | uint32 zone_name_id = 1;
186 | uint32 map_name_id = 2;
187 | }
188 | message GameStateSaveData {
189 | MapIDData last_traveled_map_id = 1;
190 | int32 mayhem_level = 2;
191 | }
192 | message ChallengeCategoryProgressSaveData {
193 | bytes category_progress = 1;
194 | }
195 | message OakPlayerCharacterAugmentSaveGameData {
196 | string slot_asset_path = 1;
197 | string augment_asset_path = 2;
198 | }
199 | message OakPlayerCharacterSlotSaveGameData {
200 | repeated OakPlayerCharacterAugmentSaveGameData augment_slot_list = 1;
201 | }
202 | message UITrackingSaveGameData {
203 | bool has_seen_skill_menu_unlock = 1;
204 | bool has_seen_guardian_rank_menu_unlock = 2;
205 | bool has_seen_echo_boot_ammo_bar = 3;
206 | bool has_seen_echo_boot_shield_bar = 4;
207 | bool has_seen_echo_boot_grenades = 5;
208 | int32 highest_thvm_breadcrumb_seen = 6;
209 | repeated string inventory_slot_unlocks_seen = 7;
210 | int32 saved_spin_offset = 8;
211 | }
212 | message PlanetCycleInfo {
213 | string planet_name = 1;
214 | float cycle_length = 2;
215 | float last_cached_time = 3;
216 | }
217 | message TimeOfDaySaveGameData {
218 | repeated PlanetCycleInfo planet_cycle_info = 1;
219 | string planet_cycle = 2;
220 | }
221 | message LevelPersistence_Actor_SaveGameData {
222 | string actor_name = 1;
223 | int32 timer_remaining = 2;
224 | }
225 | message LevelPersistence_Level_SaveGameData {
226 | string level_name = 1;
227 | repeated LevelPersistence_Actor_SaveGameData saved_actors = 2;
228 | }
229 | message GbxZoneMapFODSavedLevelData {
230 | string level_name = 1;
231 | uint32 fod_texture_size = 2;
232 | uint32 num_chunks = 3;
233 | float discovery_percentage = 4;
234 | uint32 data_state = 5;
235 | uint32 data_revision = 6;
236 | bytes fod_data = 7;
237 | }
238 | message GbxZoneMapFODSaveGameData {
239 | repeated GbxZoneMapFODSavedLevelData level_data = 1;
240 | }
241 | message Character {
242 | message NicknameMappingsEntry {
243 | string key = 1;
244 | string value = 2;
245 | }
246 | uint32 save_game_id = 1;
247 | int64 last_save_timestamp = 2;
248 | uint32 time_played_seconds = 3;
249 | PlayerClassSaveGameData player_class_data = 4;
250 | repeated ResourcePoolSavegameData resource_pools = 5;
251 | repeated RegionSaveGameData saved_regions = 6;
252 | int32 experience_points = 7;
253 | repeated GameStatSaveGameData game_stats_data = 8;
254 | repeated InventoryCategorySaveData inventory_category_list = 9;
255 | repeated OakInventoryItemSaveGameData inventory_items = 10;
256 | repeated EquippedInventorySaveGameData equipped_inventory_list = 11;
257 | repeated int32 active_weapon_list = 12;
258 | OakPlayerAbilitySaveGameData ability_data = 13;
259 | int32 last_play_through_index = 14;
260 | int32 playthroughs_completed = 15;
261 | bool show_new_playthrough_notification = 16;
262 | repeated MissionPlaythroughSaveGameData mission_playthroughs_data = 17;
263 | repeated string active_travel_stations = 21;
264 | DiscoverySaveData discovery_data = 22;
265 | string last_active_travel_station = 23;
266 | repeated VehicleUnlockedSaveGameData vehicles_unlocked_data = 24;
267 | repeated string vehicle_parts_unlocked = 25;
268 | repeated OakCARMenuVehicleConfigSaveData vehicle_loadouts = 26;
269 | int32 vehicle_last_loadout_index = 27;
270 | repeated ChallengeSaveGameData challenge_data = 28;
271 | repeated OakSDUSaveGameData sdu_list = 29;
272 | repeated string selected_customizations = 30;
273 | repeated int32 equipped_emote_customizations = 31;
274 | repeated CustomPlayerColorSaveGameData selected_color_customizations = 32;
275 | GuardianRankSaveGameData guardian_rank = 33;
276 | CrewQuartersSaveData crew_quarters_room = 34;
277 | CrewQuartersGunRackSaveData crew_quarters_gun_rack = 35;
278 | repeated EchoLogSaveGameData unlocked_echo_logs = 36;
279 | bool has_played_special_echo_log_insert_already = 37;
280 | repeated NicknameMappingsEntry nickname_mappings = 38;
281 | MapIDData last_traveled_map_id = 39;
282 | ChallengeCategoryProgressSaveData challenge_category_completion_pcts = 40;
283 | OakPlayerCharacterSlotSaveGameData character_slot_save_game_data = 41;
284 | UITrackingSaveGameData ui_tracking_save_game_data = 42;
285 | string preferred_character_name = 43;
286 | int32 name_character_limit = 44;
287 | uint32 preferred_group_mode = 45;
288 | TimeOfDaySaveGameData time_of_day_save_game_data = 46;
289 | repeated LevelPersistence_Level_SaveGameData level_persistence_data = 47;
290 | uint32 accumulated_level_persistence_reset_timer_seconds = 48;
291 | uint32 mayhem_level = 49;
292 | GbxZoneMapFODSaveGameData gbx_zone_map_fod_save_game_data = 50;
293 | repeated ActiveFastTravelSaveData active_or_blacklisted_travel_stations = 51;
294 | repeated string last_active_travel_station_for_playthrough = 52;
295 | repeated GameStateSaveData game_state_save_data_for_playthrough = 53;
296 | repeated RegisteredDownloadableEntitlements registered_downloadable_entitlements = 54;
297 | repeated PlaythroughActiveFastTravelSaveData active_travel_stations_for_playthrough = 55;
298 | string save_game_guid = 56;
299 | GuardianRankCharacterSaveGameData guardian_rank_character_data = 57;
300 | bool optional_objective_reward_fixup_applied = 58;
301 | bool vehicle_part_rewards_fixup_applied = 59;
302 | }
303 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/Protobufs/OakShared.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 | package OakSave;
3 | message Vec3 {
4 | float x = 1;
5 | float y = 2;
6 | float z = 3;
7 | }
8 | message GameStatSaveGameData {
9 | int32 stat_value = 1;
10 | string stat_path = 2;
11 | }
12 | message InventoryCategorySaveData {
13 | uint32 base_category_definition_hash = 1;
14 | int32 quantity = 2;
15 | }
16 | message OakSDUSaveGameData {
17 | int32 sdu_level = 1;
18 | string sdu_data_path = 2;
19 | }
20 | message RegisteredDownloadableEntitlement {
21 | int32 id = 1;
22 | uint32 consumed = 2;
23 | bool registered = 3;
24 | bool seen = 4;
25 | }
26 | message RegisteredDownloadableEntitlements {
27 | string entitlement_source_asset_path = 1;
28 | repeated int64 entitlement_ids = 2;
29 | repeated RegisteredDownloadableEntitlement entitlements = 3;
30 | }
31 | message ChallengeStatSaveGameData {
32 | int32 current_stat_value = 1;
33 | string challenge_stat_path = 2;
34 | }
35 | message OakChallengeRewardSaveGameData {
36 | bool challenge_reward_claimed = 1;
37 | }
38 | message ChallengeSaveGameData {
39 | int32 completed_count = 1;
40 | bool is_active = 2;
41 | bool currently_completed = 3;
42 | int32 completed_progress_level = 4;
43 | int32 progress_counter = 5;
44 | repeated ChallengeStatSaveGameData stat_instance_state = 6;
45 | string challenge_class_path = 7;
46 | repeated OakChallengeRewardSaveGameData challenge_reward_info = 8;
47 | }
48 |
--------------------------------------------------------------------------------
/BL3ProfileEditor/versionInformation.txt:
--------------------------------------------------------------------------------
1 | 1.2.6
--------------------------------------------------------------------------------
/CosmeticsGenerator/CosmeticsDownloader.py:
--------------------------------------------------------------------------------
1 |
2 | import openpyxl
3 | import requests
4 | from pathlib import Path
5 |
6 | apocalyptechSheet = 'https://docs.google.com/spreadsheets/d/1v-F_3C2ceaFKJae1b6wmbelw_jLjmPPriBLzGTZMqRc/export?format=xlsx&id=1v-F_3C2ceaFKJae1b6wmbelw_jLjmPPriBLzGTZMqRc'
7 | emotes, decos, heads, skins, echos, trinkets, weaponSkins = [],[],[],[],[],[],[]
8 |
9 | def requestGoogleSheetAsXLSX(url):
10 | print("Requesting google sheet: {}".format(url))
11 | r = requests.get(url, allow_redirects=True)
12 | open('sheetData.xlsx', 'wb').write(r.content)
13 | print("Google sheet written...")
14 |
15 | requestGoogleSheetAsXLSX(apocalyptechSheet)
16 |
17 | xlsxFile = Path('sheetData.xlsx')
18 | workbook = openpyxl.load_workbook(xlsxFile)
19 | sheetNames = workbook.sheetnames[1:]
20 | print("Sheet Names: {}".format(sheetNames))
21 |
22 | for sheetName in sheetNames:
23 | worksheet = workbook[sheetName]
24 | for row in range(2, worksheet.max_row + 1): # Iterate through each row of the worksheet
25 | cellName = "C{}".format(row)
26 | invBalance = worksheet[cellName].value
27 |
28 | if(invBalance == None):
29 | break
30 |
31 | assetPath = invBalance.replace("InvBal_","")
32 |
33 | if ("01_Wave" in assetPath or "02_Cheer" in assetPath or "03_Point" in assetPath or "04_Laugh" in assetPath) or ("default" in assetPath.lower()):
34 | continue
35 |
36 | if "Heads" in sheetName:
37 | heads += [assetPath]
38 | elif "Skins" in sheetName and "Weapon" not in sheetName:
39 | skins += [assetPath]
40 | elif "Emotes" in sheetName:
41 | emotes += [assetPath]
42 | elif "Themes" in sheetName:
43 | echos += [assetPath]
44 | elif "Decorations" in sheetName:
45 | decos += [assetPath]
46 | elif "Trinket" in sheetName:
47 | trinkets += [assetPath]
48 | elif "Weapon Skins" in sheetName:
49 | weaponSkins += [assetPath]
50 |
51 | print("Done reading {}".format(sheetName))
52 |
53 | pathFormat = "public static readonly List {0}AssetPaths = new List()"
54 |
55 | assetSets = []
56 | nameToList = {"emotes":emotes, "deco":decos, "head":heads,"skin":skins,"echo":echos, "weapon":weaponSkins, "trinket":trinkets}
57 |
58 | for name in nameToList:
59 | list = nameToList[name]
60 | assetSet = pathFormat.format(name) + '{\n'
61 | for asset in list:
62 | assetSet += ' "{0}",\n'.format(asset)
63 | assetSet = assetSet[:-2] + "\n};"
64 | assetSets += [assetSet]
65 |
66 | with open('output.txt', 'w') as outFile:
67 | completeSet = ""
68 |
69 | for assetSet in assetSets:
70 | completeSet += (assetSet + '\n')
71 |
72 | outFile.write(completeSet)
73 |
--------------------------------------------------------------------------------
/CosmeticsGenerator/CosmeticsGenerator.pyproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Debug
4 | 2.0
5 | 34e5a226-3079-4de1-9467-566714de8623
6 | .
7 | CosmeticsDownloader.py
8 |
9 |
10 | .
11 | .
12 | CosmeticsGenerator
13 | CosmeticsGenerator
14 | Global|PythonCore|3.8-32
15 |
16 |
17 | true
18 | false
19 |
20 |
21 | true
22 | false
23 |
24 |
25 |
26 | Code
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/CosmeticsGenerator/sheetData.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FromDarkHell/BL3ProfileEditor/8b27a4e695f950746e848cac4e23e280a48c0ef1/CosmeticsGenerator/sheetData.xlsx
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 FromDarkHell
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Archived
2 | **This repo is now archived in favor of the [BL3 Save Editor](https://github.com/FromDarkHell/BL3SaveEditor) by yours truly.**
3 |
4 |
5 |
6 | ## Borderlands 3 Profile Editor
7 |
8 | A slightly wonky program created so that way *you!* can edit your profile.sav file for Borderlands 3.
9 |
10 | # Installation
11 | 1. Download the exe available at [Releases](https://github.com/FromDarkHell/BL3ProfileEditor/releases)
12 | 2. Run the exe
13 | 3. Click `Open` and select your `profile.sav`.
14 | 4. Edit your profile to your hearts content
15 | 5. Whenever you're done editing, click `Save` to save your profile. Don't worry, it'll create a backup in case you wanna go back.
16 |
17 | # Credits
18 | * [Gibbed](https://github.com/Gibbed) for helping extract the protobufs from the initial exes, as well as figuring out the encryption/decryption of the profiles.
19 | * [Apocalyptech](https://github.com/apocalyptech/) for creating the [google sheet](https://docs.google.com/spreadsheets/d/1v-F_3C2ceaFKJae1b6wmbelw_jLjmPPriBLzGTZMqRc/edit?usp=sharing) that I use to create a list of cosmetics for unlocking.
20 | * [BrokenNoah](https://www.deviantart.com/brokennoah) for creating the cool free icons for [Borderlands 3](https://www.deviantart.com/brokennoah/art/Borderlands-3-icons-797030087)
21 | * [Gearbox Software](https://www.gearboxsoftware.com/) obviously for creating BL3
22 |
--------------------------------------------------------------------------------
/versionInformation.txt:
--------------------------------------------------------------------------------
1 | 1.2.5
--------------------------------------------------------------------------------