Fix MapLinkPayload to account for offset (#833)

This commit is contained in:
electr0sheep 2022-08-31 14:07:12 -06:00 committed by GitHub
parent 51c7147097
commit 73a7db56e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -39,8 +39,8 @@ namespace Dalamud.Game.Text.SeStringHandling.Payloads
// this fudge is necessary basically to ensure we don't shift down a full tenth // this fudge is necessary basically to ensure we don't shift down a full tenth
// because essentially values are truncated instead of rounded, so 3.09999f will become // because essentially values are truncated instead of rounded, so 3.09999f will become
// 3.0f and not 3.1f // 3.0f and not 3.1f
this.RawX = this.ConvertMapCoordinateToRawPosition(niceXCoord + fudgeFactor, this.Map.SizeFactor); this.RawX = this.ConvertMapCoordinateToRawPosition(niceXCoord + fudgeFactor, this.Map.SizeFactor, this.Map.OffsetX);
this.RawY = this.ConvertMapCoordinateToRawPosition(niceYCoord + fudgeFactor, this.Map.SizeFactor); this.RawY = this.ConvertMapCoordinateToRawPosition(niceYCoord + fudgeFactor, this.Map.SizeFactor, this.Map.OffsetY);
} }
/// <summary> /// <summary>
@ -103,13 +103,13 @@ namespace Dalamud.Game.Text.SeStringHandling.Payloads
/// <summary> /// <summary>
/// Gets the readable x-coordinate position for this map link. This value is approximate and unrounded. /// Gets the readable x-coordinate position for this map link. This value is approximate and unrounded.
/// </summary> /// </summary>
public float XCoord => this.ConvertRawPositionToMapCoordinate(this.RawX, this.Map.SizeFactor); public float XCoord => this.ConvertRawPositionToMapCoordinate(this.RawX, this.Map.SizeFactor, this.Map.OffsetX);
/// <summary> /// <summary>
/// Gets the readable y-coordinate position for this map link. This value is approximate and unrounded. /// Gets the readable y-coordinate position for this map link. This value is approximate and unrounded.
/// </summary> /// </summary>
[JsonIgnore] [JsonIgnore]
public float YCoord => this.ConvertRawPositionToMapCoordinate(this.RawY, this.Map.SizeFactor); public float YCoord => this.ConvertRawPositionToMapCoordinate(this.RawY, this.Map.SizeFactor, this.Map.OffsetY);
// there is no Z; it's purely in the text payload where applicable // there is no Z; it's purely in the text payload where applicable
@ -211,24 +211,36 @@ namespace Dalamud.Game.Text.SeStringHandling.Payloads
#region ugliness #region ugliness
// from https://github.com/xivapi/ffxiv-datamining/blob/master/docs/MapCoordinates.md // from https://github.com/xivapi/ffxiv-datamining/blob/master/docs/MapCoordinates.md
// extra 1/1000 because that is how the network ints are done // from https://github.com/xivapi/xivapi-mappy/blob/master/Mappy/Helpers/MapHelper.cs
private float ConvertRawPositionToMapCoordinate(int pos, float scale) // the raw scale from the map needs to be scaled down by a factor of 100
// the raw pos also needs to be scaled down by a factor of 1000
// the tile scale is ~50, but is exactly 2048/41, more info in the md file
private float ConvertRawPositionToMapCoordinate(int pos, float scale, short offset)
{ {
var c = scale / 100.0f; // extra 1/1000 because that is how the network ints are done
var scaledPos = pos * c / 1000.0f; const float networkAdjustment = 1f;
return (41.0f / c * ((scaledPos + 1024.0f) / 2048.0f)) + 1.0f; // scaling
var trueScale = scale / 100f;
var truePos = pos / 1000f;
var computedPos = (truePos + offset) * trueScale;
// pretty weird formula, but obviously has something to do with the tile scaling
return (41f / trueScale * ((computedPos + 1024f) / 2048f)) + networkAdjustment;
} }
// Created as the inverse of ConvertRawPositionToMapCoordinate(), since no one seemed to have a version of that // Created as the inverse of ConvertRawPositionToMapCoordinate(), since no one seemed to have a version of that
private int ConvertMapCoordinateToRawPosition(float pos, float scale) private int ConvertMapCoordinateToRawPosition(float pos, float scale, short offset)
{ {
var c = scale / 100.0f; const float networkAdjustment = 1f;
var scaledPos = (((pos - 1.0f) * c / 41.0f * 2048.0f) - 1024.0f) / c; // scaling
scaledPos *= 1000.0f; var trueScale = scale / 100f;
return (int)scaledPos; var num2 = (((pos - networkAdjustment) * trueScale / 41f * 2048f) - 1024f) / trueScale;
// (pos - offset) / scale, with the scaling on num2 done before for precision
num2 *= 1000f;
return (int)num2 - (offset * 1000);
} }
#endregion #endregion