diff --git a/HuntHelper/Data/Localisation/english.json b/HuntHelper/Data/Localisation/english.json index 54fe24c..360e8a2 100644 --- a/HuntHelper/Data/Localisation/english.json +++ b/HuntHelper/Data/Localisation/english.json @@ -62,6 +62,10 @@ "DirectionLineThicknessToolTip": "default: 3.0", "ResetButton": "Reset", "ResetButtonToolTip": "Reset all sizes to default.", + "MaxVisitedPositions": "MaxVisitedPositions", + "MinDistanceToSavePosition": "MinDistanceToSavePosition", + "ResetButtonTracker": "TrackerDEL", + "ResetButtonTrackerCount": "Count: ", "ColoursTab": "Colours", "PlayerIcon": "Player Icon", @@ -71,6 +75,7 @@ "PlayerBackgroundToolTip": "Background of the player / detection circle.\nChange the Alpha A: for opacity.", "DirectionLineColourPicker": "Direction Line", "DetectionCircleColourPicker": "Detection Circle", + "VisitedPositions": "Visited Positions", "NotificationTab": "Notifications", "ChatMessageLabel": "Chat Message", diff --git a/HuntHelper/Data/Localisation/french.json b/HuntHelper/Data/Localisation/french.json index 7f84984..ca86d02 100644 --- a/HuntHelper/Data/Localisation/french.json +++ b/HuntHelper/Data/Localisation/french.json @@ -62,6 +62,10 @@ "DirectionLineThicknessToolTip": "default: 3.0", "ResetButton": "Reset", "ResetButtonToolTip": "Reset all sizes to default.", + "MaxVisitedPositions": "MaxVisitedPositions", + "MinDistanceToSavePosition": "MinDistanceToSavePosition", + "ResetButtonTracker": "TrackerDEL", + "ResetButtonTrackerCount": "Count: ", "ColoursTab": "Colours", "PlayerIcon": "Player Icon", @@ -71,6 +75,7 @@ "PlayerBackgroundToolTip": "Background of the player / detection circle.\nChange the Alpha A: for opacity.", "DirectionLineColourPicker": "Direction Line", "DetectionCircleColourPicker": "Detection Circle", + "VisitedPositions": "Visited Positions", "NotificationTab": "Notifications", "ChatMessageLabel": "Chat Message", diff --git a/HuntHelper/Data/Localisation/german.json b/HuntHelper/Data/Localisation/german.json index 24bb0b1..a58c1c4 100644 --- a/HuntHelper/Data/Localisation/german.json +++ b/HuntHelper/Data/Localisation/german.json @@ -62,6 +62,10 @@ "DirectionLineThicknessToolTip": "default: 3.0", "ResetButton": "Reset", "ResetButtonToolTip": "Reset all sizes to default.", + "MaxVisitedPositions": "MaxVisitedPositions", + "MinDistanceToSavePosition": "MinDistanceToSavePosition", + "ResetButtonTracker": "TrackerDEL", + "ResetButtonTrackerCount": "Count: ", "ColoursTab": "Colours", "PlayerIcon": "Player Icon", @@ -71,6 +75,7 @@ "PlayerBackgroundToolTip": "Background of the player / detection circle.\nChange the Alpha A: for opacity.", "DirectionLineColourPicker": "Direction Line", "DetectionCircleColourPicker": "Detection Circle", + "VisitedPositions": "Visited Positions", "NotificationTab": "Notifications", "ChatMessageLabel": "Chat Message", diff --git a/HuntHelper/Data/Localisation/japanese.json b/HuntHelper/Data/Localisation/japanese.json index 24bb0b1..a58c1c4 100644 --- a/HuntHelper/Data/Localisation/japanese.json +++ b/HuntHelper/Data/Localisation/japanese.json @@ -62,6 +62,10 @@ "DirectionLineThicknessToolTip": "default: 3.0", "ResetButton": "Reset", "ResetButtonToolTip": "Reset all sizes to default.", + "MaxVisitedPositions": "MaxVisitedPositions", + "MinDistanceToSavePosition": "MinDistanceToSavePosition", + "ResetButtonTracker": "TrackerDEL", + "ResetButtonTrackerCount": "Count: ", "ColoursTab": "Colours", "PlayerIcon": "Player Icon", @@ -71,6 +75,7 @@ "PlayerBackgroundToolTip": "Background of the player / detection circle.\nChange the Alpha A: for opacity.", "DirectionLineColourPicker": "Direction Line", "DetectionCircleColourPicker": "Detection Circle", + "VisitedPositions": "Visited Positions", "NotificationTab": "Notifications", "ChatMessageLabel": "Chat Message", diff --git a/HuntHelper/Data/Localisation/simplified chinese.json b/HuntHelper/Data/Localisation/simplified chinese.json index 01cae21..ac0604d 100644 --- a/HuntHelper/Data/Localisation/simplified chinese.json +++ b/HuntHelper/Data/Localisation/simplified chinese.json @@ -62,6 +62,10 @@ "DirectionLineThicknessToolTip": "默认3", "ResetButton": "重设", "ResetButtonToolTip": "重设所有到默认设置", + "MaxVisitedPositions": "MaxVisitedPositions", + "MinDistanceToSavePosition": "MinDistanceToSavePosition", + "ResetButtonTracker": "TrackerDEL", + "ResetButtonTrackerCount": "Count: ", "ColoursTab": "颜色", "PlayerIcon": "玩家图标", @@ -71,6 +75,7 @@ "PlayerBackgroundToolTip": "玩家/探测圈背景。\n修改Alpha A来设置透明度", "DirectionLineColourPicker": "面向线", "DetectionCircleColourPicker": "探测线", + "VisitedPositions": "Visited Positions", "NotificationTab": "通知", "ChatMessageLabel": "聊天信息", diff --git a/HuntHelper/Gui/MapUI.cs b/HuntHelper/Gui/MapUI.cs index 8a38640..46629f9 100644 --- a/HuntHelper/Gui/MapUI.cs +++ b/HuntHelper/Gui/MapUI.cs @@ -48,6 +48,12 @@ class MapUI : IDisposable private float _spawnPointIconRadius; #region User Customisable stuff - load and save to config + + // PlayerTracker + private List _visitedPositions = new List(); + private float _minDistanceToSavePosition = 0.5f; // Minimum distance to save a position + private int _maxVisitedPositions = 250; // Maximum positions for drawing + private Vector4 _playerIconBackgroundColourPositions = new Vector4(1f, 0.27f, 0f, 0.1f); //orange (RGBA%) //map opacity - should be between 0-100f; private float _mapImageOpacityAsPercentage = 100f; @@ -303,6 +309,10 @@ public void DrawHuntMapWindow() //if only something went wrong, such as only some maps images downloaded if (_huntManager.ImageFolderDoesntExist || _huntManager.HasDownloadErrors || _huntManager.NotAllImagesFound || _outOfDateImages) MapImageDownloadWindow(); DrawMapImage(mapImage); + + // Draw the overlay with the visited areas + var drawlist = ImGui.GetWindowDrawList(); + DrawVisitedAreas(drawlist); } //show map coordinates when mouse is over gui @@ -719,6 +729,25 @@ private void DrawOptionsWindow() ImGui.SameLine(); ImGuiUtil.ImGui_HelpMarker(GuiResources.MapGuiText["ResetButtonToolTip"]); + ImGui.TableNextColumn(); + ImGui.Separator(); + ImGui.Dummy(new Vector2(0, 1f)); + ImGui.InputFloat(GuiResources.MapGuiText["MinDistanceToSavePosition"], ref _minDistanceToSavePosition, 0, 0, + "%.2f"); + + ImGui.TableNextColumn(); + ImGui.Separator(); + ImGui.Dummy(new Vector2(0, 1f)); + ImGui.InputInt(GuiResources.MapGuiText["MaxVisitedPositions"], ref _maxVisitedPositions, 0); + + ImGui.TableNextColumn(); + ImGui.Separator(); + ImGui.Dummy(new Vector2(0, 1f)); + if (ImGui.Button(GuiResources.MapGuiText["ResetButtonTracker"] + " " + GuiResources.MapGuiText["ResetButtonTrackerCount"] + Convert.ToString(_visitedPositions.Count))) + { + ResetVisitedPositions(); + } + ImGui.PopItemWidth(); ImGui.EndTable(); @@ -751,6 +780,10 @@ private void DrawOptionsWindow() ImGui.ColorEdit4(GuiResources.MapGuiText["SpawnPoint"], ref _spawnPointColour, ImGuiColorEditFlags.NoInputs | ImGuiColorEditFlags.PickerHueWheel); + ImGui.TableNextColumn(); + ImGui.ColorEdit4(GuiResources.MapGuiText["VisitedPositions"], ref _playerIconBackgroundColourPositions, + ImGuiColorEditFlags.NoInputs | ImGuiColorEditFlags.PickerHueWheel); + ImGui.Dummy(new Vector2(0, 4f)); ImGui.TableNextColumn(); @@ -1394,8 +1427,15 @@ private unsafe void ClientState_TerritoryChanged(ushort e) //_worldName = _clientState.LocalPlayer?.CurrentWorld?.GameData?.Name.ToString() ?? "Not Found"; _territoryId = _clientState.TerritoryType; _mapZoneScale = _huntManager.GetMapZoneScale(_territoryId); + // When changing the territory, clear the list + ResetVisitedPositions(); } + private void ResetVisitedPositions() + { + _visitedPositions = new List(); + } + #region Draw Sub Windows private void DrawDataBaseWindow() @@ -1675,9 +1715,21 @@ private void UpdatePlayerInfo() //if this stuff ain't null, draw player position if (_clientState?.LocalPlayer?.Position != null) { - var playerPos = CoordinateToPositionInWindow( - new Vector2(ConvertPosToCoordinate(_clientState!.LocalPlayer.Position.X), - ConvertPosToCoordinate(_clientState.LocalPlayer.Position.Z))); + var playerPosWithoutWindow = new Vector2(ConvertPosToCoordinate(_clientState!.LocalPlayer.Position.X), + ConvertPosToCoordinate(_clientState.LocalPlayer.Position.Z)); // WithoutWindow is necessary so that no new position is saved when the window is moved. + var playerPos = CoordinateToPositionInWindow(playerPosWithoutWindow); + + // Save the location if it is new + if (!_visitedPositions.Any() || + Vector2.Distance(_visitedPositions.Last(), playerPosWithoutWindow) > _minDistanceToSavePosition) + { + _visitedPositions.Add(playerPosWithoutWindow); + // Shorten the list if it gets too long. + if (_visitedPositions.Count > _maxVisitedPositions) + { + _visitedPositions.RemoveAt(0); // Remove the oldest entry + } + } var detectionRadius = 2 * SingleCoordSize * _detectionCircleModifier; var rotation = Math.Abs(_clientState.LocalPlayer.Rotation - Math.PI); @@ -1697,6 +1749,20 @@ private void UpdatePlayerInfo() } } + + private void DrawVisitedAreas(ImDrawListPtr drawlist) + { + foreach (var pos in _visitedPositions) + { + // Draw a circle at each position visited. + var detectionRadius = 2 * SingleCoordSize * _detectionCircleModifier; + drawlist.AddCircleFilled( + CoordinateToPositionInWindow(pos), + detectionRadius, + ImGui.ColorConvertFloat4ToU32(_playerIconBackgroundColourPositions) + ); + } + } private void DrawPlayerIcon(ImDrawListPtr drawlist, Vector2 playerPos, float detectionRadius, Vector2 lineEnding, Vector2 projectedPathEnd) {