diff --git a/FModel/MainWindow.xaml b/FModel/MainWindow.xaml
index 651f1cac..c926fc3c 100644
--- a/FModel/MainWindow.xaml
+++ b/FModel/MainWindow.xaml
@@ -15,7 +15,7 @@
-
+
diff --git a/FModel/ViewModels/ApplicationViewModel.cs b/FModel/ViewModels/ApplicationViewModel.cs
index 335821e6..3abef1de 100644
--- a/FModel/ViewModels/ApplicationViewModel.cs
+++ b/FModel/ViewModels/ApplicationViewModel.cs
@@ -1,4 +1,4 @@
-using FModel.Extensions;
+using FModel.Extensions;
using FModel.Framework;
using FModel.Services;
using FModel.Settings;
@@ -61,7 +61,7 @@ namespace FModel.ViewModels
public CopyCommand CopyCommand => _copyCommand ??= new CopyCommand(this);
private CopyCommand _copyCommand;
- public string TitleExtra => $"{CUE4Parse.Game.GetDescription()} ({UserSettings.Default.OverridedGame[CUE4Parse.Game]}){(Build != EBuildKind.Release ? $" ({Build})" : "")}";
+ public string TitleExtra => $"{UserSettings.Default.UpdateMode} - {CUE4Parse.Game.GetDescription()} ({UserSettings.Default.OverridedGame[CUE4Parse.Game]}){(Build != EBuildKind.Release ? $" ({Build})" : "")}";
public LoadingModesViewModel LoadingModes { get; }
public CustomDirectoriesViewModel CustomDirectories { get; }
diff --git a/FModel/ViewModels/MapViewerViewModel.cs b/FModel/ViewModels/MapViewerViewModel.cs
index e85b0064..d8793896 100644
--- a/FModel/ViewModels/MapViewerViewModel.cs
+++ b/FModel/ViewModels/MapViewerViewModel.cs
@@ -54,6 +54,13 @@ namespace FModel.ViewModels
set => SetProperty(ref _brLandmarks, value, "ApolloGameplay_MapLandmarks");
}
+ private bool _brTagsLocation;
+ public bool BrTagsLocation
+ {
+ get => _brTagsLocation;
+ set => SetProperty(ref _brTagsLocation, value, "ApolloGameplay_TagsLocation");
+ }
+
private bool _brPatrolsPath;
public bool BrPatrolsPath
{
@@ -75,18 +82,25 @@ namespace FModel.ViewModels
set => SetProperty(ref _brPhonebooths, value, "ApolloGameplay_Phonebooths");
}
- private bool _brTagsLocation;
- public bool BrTagsLocation
+ private bool _brVendingMachines;
+ public bool BrVendingMachines
{
- get => _brTagsLocation;
- set => SetProperty(ref _brTagsLocation, value, "ApolloGameplay_TagsLocation");
+ get => _brVendingMachines;
+ set => SetProperty(ref _brVendingMachines, value, "ApolloGameplay_VendingMachines");
}
- private bool _brAlienArtifacts;
- public bool BrAlienArtifacts
+ private bool _brFireflies;
+ public bool BrFireflies
{
- get => _brAlienArtifacts;
- set => SetProperty(ref _brAlienArtifacts, value, "ApolloGameplay_AlienArtifacts");
+ get => _brFireflies;
+ set => SetProperty(ref _brFireflies, value, "ApolloGameplay_Fireflies");
+ }
+
+ private bool _brInks;
+ public bool BrInks
+ {
+ get => _brInks;
+ set => SetProperty(ref _brInks, value, "ApolloGameplay_Inks");
}
private bool _prLandmarks;
@@ -243,6 +257,9 @@ namespace FModel.ViewModels
case "PapayaGameplay_MapLandmarks":
await LoadQuestIndicatorData();
break;
+ case "ApolloGameplay_TagsLocation":
+ await LoadTagsLocation();
+ break;
case "ApolloGameplay_PatrolsPath":
await LoadPatrolsPath();
break;
@@ -252,11 +269,14 @@ namespace FModel.ViewModels
case "ApolloGameplay_Phonebooths":
await LoadPhonebooths();
break;
- case "ApolloGameplay_AlienArtifacts":
- await LoadAlienArtifacts();
+ case "ApolloGameplay_VendingMachines":
+ await LoadBrVendingMachines();
break;
- case "ApolloGameplay_TagsLocation":
- await LoadTagsLocation();
+ case "ApolloGameplay_Fireflies":
+ await LoadFireflies();
+ break;
+ case "ApolloGameplay_Inks":
+ await LoadInks();
break;
case "PapayaGameplay_CannonballGame":
await LoadCannonballGame();
@@ -274,7 +294,7 @@ namespace FModel.ViewModels
await LoadWaypoint(EWaypointType.TimeTrials);
break;
case "PapayaGameplay_VendingMachines":
- await LoadVendingMachines();
+ await LoadPrVendingMachines();
break;
case "PapayaGameplay_MusicBlocks":
await LoadMusicBlocks();
@@ -453,24 +473,20 @@ namespace FModel.ViewModels
var patrolsPathBitmap = new SKBitmap(_widthHeight, _widthHeight, SKColorType.Rgba8888, SKAlphaType.Premul);
using var c = new SKCanvas(patrolsPathBitmap);
- var exports = Utils.LoadExports("/NPCLibrary/LevelOverlays/Apollo_Terrain_NPCLibraryS17_Overlay");
+ var exports = Utils.LoadExports("/NPCLibrary/LevelOverlays/Apollo_Terrain_NPCLibrary_Overlay_S18");
foreach (var export in exports)
{
- if (export is not { } uObject) continue;
- if (!uObject.ExportType.Equals("FortAthenaPatrolPath", StringComparison.OrdinalIgnoreCase) ||
- !uObject.TryGetValue(out FGameplayTagContainer gameplayTags, "GameplayTags") ||
- !uObject.TryGetValue(out FPackageIndex[] patrolPoints, "PatrolPoints")) continue;
+ if (!export.ExportType.Equals("FortAthenaPatrolPath", StringComparison.OrdinalIgnoreCase) ||
+ !export.TryGetValue(out FPackageIndex[] patrolPoints, "PatrolPoints")) continue;
- var displayName = gameplayTags.GameplayTags[0].Text.SubstringAfterLast(".");
- if (displayName.Equals("Generic", StringComparison.OrdinalIgnoreCase)) continue;
-
- if (!Utils.TryGetPackageIndexExport(patrolPoints[0], out uObject) ||
+ if (!Utils.TryGetPackageIndexExport(patrolPoints[0], out UObject uObject) ||
!uObject.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
!Utils.TryGetPackageIndexExport(rootComponent, out uObject) ||
!uObject.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
var path = new SKPath();
var vector = GetMapPosition(relativeLocation, _brRadius);
+ var displayName = export.Name["FortAthenaPatrolPath_Tandem_S18_".Length..];
path.MoveTo(vector.X, vector.Y);
for (var i = 1; i < patrolPoints.Length; i++)
@@ -504,12 +520,11 @@ namespace FModel.ViewModels
var exports = Utils.LoadExports("/PapayaGameplay/LevelOverlays/PapayaGameplay_CannonballGame");
foreach (var export in exports)
{
- if (export is not { } uObject) continue;
- if (!uObject.ExportType.Equals("BP_CannonballGame_Target_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("CannonballGame_VehicleSpawner_C", StringComparison.OrdinalIgnoreCase)) continue;
+ if (!export.ExportType.Equals("BP_CannonballGame_Target_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("CannonballGame_VehicleSpawner_C", StringComparison.OrdinalIgnoreCase)) continue;
- if (!uObject.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
- !Utils.TryGetPackageIndexExport(rootComponent, out uObject) ||
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ !Utils.TryGetPackageIndexExport(rootComponent, out UObject uObject) ||
!uObject.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
var displayName = Utils.GetLocalizedResource("", "D998BEF44F051E0885C6C58565934BEA", "Cannonball");
@@ -535,12 +550,11 @@ namespace FModel.ViewModels
var exports = Utils.LoadExports("/PapayaGameplay/LevelOverlays/PapayaGameplay_SkydiveGame");
foreach (var export in exports)
{
- if (export is not { } uObject) continue;
- if (!uObject.ExportType.Equals("BP_Waypoint_Papaya_Skydive_Start_C", StringComparison.OrdinalIgnoreCase)) continue;
+ if (!export.ExportType.Equals("BP_Waypoint_Papaya_Skydive_Start_C", StringComparison.OrdinalIgnoreCase)) continue;
- if (!uObject.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
- !uObject.TryGetValue(out FText minigameActivityName, "MinigameActivityName") ||
- !Utils.TryGetPackageIndexExport(rootComponent, out uObject) ||
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ !export.TryGetValue(out FText minigameActivityName, "MinigameActivityName") ||
+ !Utils.TryGetPackageIndexExport(rootComponent, out UObject uObject) ||
!uObject.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
var vector = GetMapPosition(relativeLocation, _prRadius);
@@ -566,11 +580,10 @@ namespace FModel.ViewModels
var exports = Utils.LoadExports("/PapayaGameplay/LevelOverlays/PapayaGameplay_ShootingTargets");
foreach (var export in exports)
{
- if (export is not { } uObject) continue;
- if (!uObject.ExportType.Equals("PapayaShootingTarget_C", StringComparison.OrdinalIgnoreCase)) continue;
+ if (!export.ExportType.Equals("PapayaShootingTarget_C", StringComparison.OrdinalIgnoreCase)) continue;
- if (!uObject.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
- !Utils.TryGetPackageIndexExport(rootComponent, out uObject) ||
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ !Utils.TryGetPackageIndexExport(rootComponent, out UObject uObject) ||
!uObject.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
var vector = GetMapPosition(relativeLocation, _prRadius);
@@ -614,21 +627,20 @@ namespace FModel.ViewModels
var exports = Utils.LoadExports($"/PapayaGameplay/LevelOverlays/{file}");
foreach (var export in exports)
{
- if (export is not { } uObject) continue;
- if (!uObject.ExportType.Equals("BP_Waypoint_Parent_Papaya_C", StringComparison.OrdinalIgnoreCase)) continue;
+ if (!export.ExportType.Equals("BP_Waypoint_Parent_Papaya_C", StringComparison.OrdinalIgnoreCase)) continue;
- if (!uObject.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
!Utils.TryGetPackageIndexExport(rootComponent, out UObject root) ||
!root.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
var vector = GetMapPosition(relativeLocation, _prRadius);
- if (path.IsEmpty || uObject.TryGetValue(out bool startsTrial, "StartsTrial") && startsTrial)
+ if (path.IsEmpty || export.TryGetValue(out bool startsTrial, "StartsTrial") && startsTrial)
{
path.MoveTo(vector.X, vector.Y);
c.DrawText(name, vector.X, vector.Y - 12.5F, _fillPaint);
c.DrawText(name, vector.X, vector.Y - 12.5F, _textPaint);
}
- else if (uObject.TryGetValue(out bool endsTrial, "EndsTrial") && endsTrial)
+ else if (export.TryGetValue(out bool endsTrial, "EndsTrial") && endsTrial)
{
path.LineTo(vector.X, vector.Y);
c.DrawPath(path, _pathPaint);
@@ -641,7 +653,7 @@ namespace FModel.ViewModels
});
}
- private async Task LoadVendingMachines()
+ private async Task LoadPrVendingMachines()
{
await _threadWorkerView.Begin(_ =>
{
@@ -653,27 +665,26 @@ namespace FModel.ViewModels
var exports = Utils.LoadExports("/PapayaGameplay/LevelOverlays/PapayaGameplay_VendingMachines");
foreach (var export in exports)
{
- if (export is not { } uObject) continue;
- if (!uObject.ExportType.Equals("B_Papaya_VendingMachine_Boat_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_BoogieBomb_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_Burger_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_CrashPad_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_FishingPole_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_Grappler_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_Jetpack_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_PaintGrenade_Blue_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_PaintGrenade_Red_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_PaintLauncher_Blue_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_PaintLauncher_Red_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_PlungerBow_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_Quad_C", StringComparison.OrdinalIgnoreCase) &&
- !uObject.ExportType.Equals("B_Papaya_VendingMachine_Tomato_C", StringComparison.OrdinalIgnoreCase)) continue;
+ if (!export.ExportType.Equals("B_Papaya_VendingMachine_Boat_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_BoogieBomb_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_Burger_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_CrashPad_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_FishingPole_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_Grappler_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_Jetpack_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_PaintGrenade_Blue_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_PaintGrenade_Red_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_PaintLauncher_Blue_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_PaintLauncher_Red_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_PlungerBow_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_Quad_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Papaya_VendingMachine_Tomato_C", StringComparison.OrdinalIgnoreCase)) continue;
- if (!uObject.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
!Utils.TryGetPackageIndexExport(rootComponent, out UObject root) ||
!root.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
- var name = uObject.ExportType.SubstringAfter("B_Papaya_VendingMachine_").SubstringBeforeLast("_C");
+ var name = export.ExportType.SubstringAfter("B_Papaya_VendingMachine_").SubstringBeforeLast("_C");
var vector = GetMapPosition(relativeLocation, _prRadius);
c.DrawPoint(vector.X, vector.Y, _pathPaint);
if (!set.Add(name)) continue;
@@ -698,11 +709,10 @@ namespace FModel.ViewModels
var exports = Utils.LoadExports("/PapayaGameplay/LevelOverlays/PapayaGameplay_MusicBlocks");
foreach (var export in exports)
{
- if (export is not { } uObject) continue;
- if (!uObject.ExportType.Equals("MusicBlock_Piano3_Papaya_C", StringComparison.OrdinalIgnoreCase)) continue;
+ if (!export.ExportType.Equals("MusicBlock_Piano3_Papaya_C", StringComparison.OrdinalIgnoreCase)) continue;
- if (!uObject.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
- !Utils.TryGetPackageIndexExport(rootComponent, out uObject) ||
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ !Utils.TryGetPackageIndexExport(rootComponent, out UObject uObject) ||
!uObject.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
var vector = GetMapPosition(relativeLocation, _prRadius);
@@ -729,12 +739,11 @@ namespace FModel.ViewModels
var exports = Utils.LoadExports("/NPCLibrary/LevelOverlays/Apollo_Terrain_NPCLibrary_Stations_UpgradeBenches");
foreach (var export in exports)
{
- if (export is not { } uObject) continue;
- if (!uObject.ExportType.Equals("B_Athena_Spawner_UpgradeStation_C", StringComparison.OrdinalIgnoreCase)) continue;
- var displayName = uObject.Name["B_Athena_Spawner_".Length..];
+ if (!export.ExportType.Equals("B_Athena_Spawner_UpgradeStation_C", StringComparison.OrdinalIgnoreCase)) continue;
+ var displayName = export.Name["B_Athena_Spawner_".Length..];
- if (!uObject.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
- !Utils.TryGetPackageIndexExport(rootComponent, out uObject) ||
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ !Utils.TryGetPackageIndexExport(rootComponent, out UObject uObject) ||
!uObject.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
var vector = GetMapPosition(relativeLocation, _brRadius);
@@ -758,12 +767,11 @@ namespace FModel.ViewModels
var exports = Utils.LoadExports("/NPCLibrary/LevelOverlays/Apollo_Terrain_NPCLibrary_Stations_Phonebooths");
foreach (var export in exports)
{
- if (export is not { } uObject) continue;
- if (!uObject.ExportType.Equals("B_Athena_Spawner_Payphone_C", StringComparison.OrdinalIgnoreCase)) continue;
- var displayName = uObject.Name["B_Athena_Spawner_".Length..];
+ if (!export.ExportType.Equals("B_Athena_Spawner_Payphone_C", StringComparison.OrdinalIgnoreCase)) continue;
+ var displayName = export.Name["B_Athena_Spawner_".Length..];
- if (!uObject.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
- !Utils.TryGetPackageIndexExport(rootComponent, out uObject) ||
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ !Utils.TryGetPackageIndexExport(rootComponent, out UObject uObject) ||
!uObject.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
var vector = GetMapPosition(relativeLocation, _brRadius);
@@ -776,23 +784,23 @@ namespace FModel.ViewModels
});
}
- private async Task LoadAlienArtifacts()
+ private async Task LoadBrVendingMachines()
{
await _threadWorkerView.Begin(_ =>
{
_fillPaint.StrokeWidth = 5;
- var alienArtifactsBitmap = new SKBitmap(_widthHeight, _widthHeight, SKColorType.Rgba8888, SKAlphaType.Premul);
- using var c = new SKCanvas(alienArtifactsBitmap);
+ var vendingMachinesBitmap = new SKBitmap(_widthHeight, _widthHeight, SKColorType.Rgba8888, SKAlphaType.Premul);
+ using var c = new SKCanvas(vendingMachinesBitmap);
- var exports = Utils.LoadExports("/BattlepassS17/Maps/Apollo_ItemCollect_S17_Overlay");
+ var exports = Utils.LoadExports("FortniteGame/Content/Athena/Apollo/Maps/Special/ItemCollections/Apollo_Item_VendingMachines");
foreach (var export in exports)
{
- if (export is not { } uObject) continue;
- if (!uObject.ExportType.Equals("BP_S17_AlienArtifact_Variant1_C", StringComparison.OrdinalIgnoreCase)) continue;
- var displayName = uObject.Name;
+ if (!export.ExportType.Equals("B_Athena_Spawner_VendingMachine_MendingOnly_C", StringComparison.OrdinalIgnoreCase) &&
+ !export.ExportType.Equals("B_Athena_Spawner_VendingMachine_Random_C", StringComparison.OrdinalIgnoreCase)) continue;
+ var displayName = $"{(export.ExportType.Contains("Mending") ? "MM" : "WOM")}_{export.Name["B_Athena_Spawner_VendingMachine_Random".Length..]}";
- if (!uObject.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
- !Utils.TryGetPackageIndexExport(rootComponent, out uObject) ||
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ !Utils.TryGetPackageIndexExport(rootComponent, out UObject uObject) ||
!uObject.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
var vector = GetMapPosition(relativeLocation, _brRadius);
@@ -801,7 +809,74 @@ namespace FModel.ViewModels
c.DrawText(displayName, vector.X, vector.Y - 12.5F, _textPaint);
}
- _bitmaps[0]["ApolloGameplay_AlienArtifacts"] = new MapLayer {Layer = alienArtifactsBitmap, IsEnabled = false};
+ _bitmaps[0]["ApolloGameplay_VendingMachines"] = new MapLayer {Layer = vendingMachinesBitmap, IsEnabled = false};
+ });
+ }
+
+ private async Task LoadInks()
+ {
+ await _threadWorkerView.Begin(_ =>
+ {
+ _fillPaint.StrokeWidth = 5;
+ var inksBitmap = new SKBitmap(_widthHeight, _widthHeight, SKColorType.Rgba8888, SKAlphaType.Premul);
+ using var c = new SKCanvas(inksBitmap);
+
+ if (!Utils.TryLoadObject("BattlePassS18/Maps/BattlepassS18_LevelOverlay_Config.BattlepassS18_LevelOverlay_Config", out UObject config) ||
+ !config.TryGetValue(out FStructFallback[] overlayList, "OverlayList") || overlayList.Length < 1)
+ return;
+
+ foreach (var overlay in overlayList)
+ {
+ if (!overlay.TryGetValue(out FSoftObjectPath overlayWorld, "OverlayWorld")) continue;
+
+ var exports = Utils.LoadExports(overlayWorld.AssetPathName.Text.SubstringBeforeLast("."));
+ foreach (var export in exports)
+ {
+ if (!export.ExportType.StartsWith("BP_S18_ToonInk_CollectibleColor", StringComparison.OrdinalIgnoreCase)) continue;
+
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ !Utils.TryGetPackageIndexExport(rootComponent, out UObject uObject) ||
+ !uObject.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
+
+ if (!export.TryGetValue(out FPackageIndex questIconComponent, "QuestIconComponent") ||
+ !Utils.TryGetPackageIndexExport(questIconComponent, out uObject) ||
+ !uObject.TryGetValue(out FStructFallback mapIconData, "MapIconData") ||
+ !mapIconData.TryGetValue(out FPackageIndex mapIcon, "MapIcon")) continue;
+
+ var vector = GetMapPosition(relativeLocation, _brRadius);
+ c.DrawBitmap(Utils.GetBitmap(mapIcon), vector.X, vector.Y);
+ }
+ }
+
+ _bitmaps[0]["ApolloGameplay_Inks"] = new MapLayer {Layer = inksBitmap, IsEnabled = false};
+ });
+ }
+
+ private async Task LoadFireflies()
+ {
+ await _threadWorkerView.Begin(_ =>
+ {
+ _fillPaint.StrokeWidth = 5;
+ var firefliesBitmap = new SKBitmap(_widthHeight, _widthHeight, SKColorType.Rgba8888, SKAlphaType.Premul);
+ using var c = new SKCanvas(firefliesBitmap);
+
+ var exports = Utils.LoadExports("FortniteGame/Content/Athena/Apollo/Maps/Special/ItemCollections/Apollo_Item_Fireflies");
+ foreach (var export in exports)
+ {
+ if (!export.ExportType.Equals("BP_BGACSpawner_Fireflies_C", StringComparison.OrdinalIgnoreCase)) continue;
+ var displayName = $"FF_{export.Name["BP_BGACSpawnerFireFlies".Length..]}";
+
+ if (!export.TryGetValue(out FPackageIndex rootComponent, "RootComponent") ||
+ !Utils.TryGetPackageIndexExport(rootComponent, out UObject uObject) ||
+ !uObject.TryGetValue(out FVector relativeLocation, "RelativeLocation")) continue;
+
+ var vector = GetMapPosition(relativeLocation, _brRadius);
+ c.DrawPoint(vector.X, vector.Y, _pathPaint);
+ c.DrawText(displayName, vector.X, vector.Y - 12.5F, _fillPaint);
+ c.DrawText(displayName, vector.X, vector.Y - 12.5F, _textPaint);
+ }
+
+ _bitmaps[0]["ApolloGameplay_Fireflies"] = new MapLayer {Layer = firefliesBitmap, IsEnabled = false};
});
}
diff --git a/FModel/Views/MapViewer.xaml b/FModel/Views/MapViewer.xaml
index b68d3f7f..d42150b3 100644
--- a/FModel/Views/MapViewer.xaml
+++ b/FModel/Views/MapViewer.xaml
@@ -27,16 +27,20 @@
DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:Views.MapViewer}}}" IsEnabled="{Binding IsReady}" />
+
-
-
+
+