EntityCoordinates are a new and hip way to represent an entity’s position relative to another entity. They consist of an EntityUid, an X coordinate and a Y coordinate.
Unlike GridCoordinates, these coordinates aren’t bound to a specific grid: They can be used to represent the position of entities attached to the map, attached to a specific grid, attached to another entity, or entities without a parent.
Due to the nature of these coordinates, they can become invalid under certain circumstances, like when the EntityUid is invalid or when its entity is deleted.
If an entity doesn’t have a parent, their EntityCoordinates points to itself with offset 0. This is the case with map entities, or entities that don’t have a parent entity.
When an entity becomes attached to a new parent (for example when entering a locker or buckling yourself to a chair) your EntityCoordinates now become relative to that entity. In the case of lockers, disposals and chairs this means your new relative position is (0, 0) since you’re standing in the same position as your parent.
If you get a grid entity’s EntityCoordinates and then call the
GetGridId()method on it, you’ll always get
GridId.Invalid. This is because grids can NEVER have another grid as an ancestor, and
GetGridIdreturns the grid Id the parent is on. In the case of maps, this is always
GridId.Invalid. This also happens when you attempt to get the grid an entity without a parent or parented to the map is on.
Entities in space have no parent grid, thus will return
GetGridId(). If your logic should work in space as well as on a grid, make sure you aren’t relying on
Most EntityCoordinates methods require you to pass
IMapManageras arguments. Since EntityCoordinates methods are very low level, performing IoC resolves for those would be very costly. Please try to cache these dependencies instead of resolving them every time you work with EntityCoordinates, as not doing so could hurt performance.