Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change storage method for waypoints to support map markers #4564

Merged
merged 1 commit into from
Sep 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
173 changes: 112 additions & 61 deletions scripts/globals/waypoint.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,79 +21,80 @@ local waypointStartIndex =
[xi.zone.LOWER_JEUNO ] = 100,
}

-- Table Format: Index = { Offset, GroupID, EventID, { Teleport Position } }
-- Table Format: Index = { Offset, GroupID, EventID, { Teleport Position }, unlockTablePos }
-- Note: Group ID is unused at this time, but can be observed in the eventUpdate option. This remains
-- in case it is needed for future implementations
-- in case it is needed for future implementations. unlockTablePos is the location stored in char_unlocks
-- which is utilized for displaying the appropriate map marker.
local waypointInfo =
{
-- Western Adoulin
[1] = { 0, 1, 5000, { 4.896, 0, -4.789, 33, xi.zone.WESTERN_ADOULIN } }, -- Platea Triumphus
[2] = { 1, 1, 5001, { -110.5, 3.85, -13.482, 191, xi.zone.WESTERN_ADOULIN } }, -- Pioneer's Coalition
[3] = { 2, 1, 5002, { -20.982, -0.15, -79.891, 127, xi.zone.WESTERN_ADOULIN } }, -- Mummer's Coalition
[4] = { 3, 1, 5003, { 91.451, -0.15, -49.013, 0, xi.zone.WESTERN_ADOULIN } }, -- Inventor's Coalition
[5] = { 4, 1, 5004, { -68.099, 4, -73.672, 28, xi.zone.WESTERN_ADOULIN } }, -- Auction House
[6] = { 5, 1, 5005, { 5.731, 0, -123.043, 127, xi.zone.WESTERN_ADOULIN } }, -- Rent-a-Room
[7] = { 6, 1, 5006, { 174.783, 3.85, -35.788, 63, xi.zone.WESTERN_ADOULIN } }, -- Big Bridge
[8] = { 7, 1, 5007, { 14.586, 0, 162.608, 191, xi.zone.WESTERN_ADOULIN } }, -- Airship Docks
[9] = { 8, 1, 5008, { 51.094, 32, 126.299, 191, xi.zone.WESTERN_ADOULIN } }, -- Adoulin Waterfront
[1] = { 0, 1, 5000, { 4.896, 0, -4.789, 33, xi.zone.WESTERN_ADOULIN }, 0 }, -- Platea Triumphus
[2] = { 1, 1, 5001, { -110.5, 3.85, -13.482, 191, xi.zone.WESTERN_ADOULIN }, 1 }, -- Pioneer's Coalition
[3] = { 2, 1, 5002, { -20.982, -0.15, -79.891, 127, xi.zone.WESTERN_ADOULIN }, 2 }, -- Mummer's Coalition
[4] = { 3, 1, 5003, { 91.451, -0.15, -49.013, 0, xi.zone.WESTERN_ADOULIN }, 3 }, -- Inventor's Coalition
[5] = { 4, 1, 5004, { -68.099, 4, -73.672, 28, xi.zone.WESTERN_ADOULIN }, 4 }, -- Auction House
[6] = { 5, 1, 5005, { 5.731, 0, -123.043, 127, xi.zone.WESTERN_ADOULIN }, 5 }, -- Rent-a-Room
[7] = { 6, 1, 5006, { 174.783, 3.85, -35.788, 63, xi.zone.WESTERN_ADOULIN }, 6 }, -- Big Bridge
[8] = { 7, 1, 5007, { 14.586, 0, 162.608, 191, xi.zone.WESTERN_ADOULIN }, 7 }, -- Airship Docks
[9] = { 8, 1, 5008, { 51.094, 32, 126.299, 191, xi.zone.WESTERN_ADOULIN }, 8 }, -- Adoulin Waterfront

-- Eastern Adoulin
[21] = { 15, 2, 5000, { -101.274, -0.15, -10.726, 191, xi.zone.EASTERN_ADOULIN } }, -- Peacekeeper's Coalition
[22] = { 16, 2, 5001, { -77.944, -0.15, -63.926, 0, xi.zone.EASTERN_ADOULIN } }, -- Scout's Coalition
[23] = { 17, 2, 5002, { -46.838, -0.075, -12.767, 63, xi.zone.EASTERN_ADOULIN } }, -- Statue of the Goddess
[24] = { 18, 2, 5003, { -57.773, -0.15, 85.237, 127, xi.zone.EASTERN_ADOULIN } }, -- Yahse Wharf
[25] = { 19, 2, 5004, { -61.865, -0.15, -120.81, 127, xi.zone.EASTERN_ADOULIN } }, -- Rent-a-Room
[26] = { 20, 2, 5005, { -42.065, -0.15, -89.979, 191, xi.zone.EASTERN_ADOULIN } }, -- Auction House
[27] = { 21, 2, 5006, { 11.681, -22.15, 29.976, 127, xi.zone.EASTERN_ADOULIN } }, -- Sverdhried Hillock
[28] = { 22, 2, 5007, { 27.124, -40.15, -60.844, 127, xi.zone.EASTERN_ADOULIN } }, -- Coronal Esplanade
[29] = { 23, 2, 5008, { 95.994, -40.15, -74.541, 0, xi.zone.EASTERN_ADOULIN } }, -- Castle Gates
[21] = { 15, 2, 5000, { -101.274, -0.15, -10.726, 191, xi.zone.EASTERN_ADOULIN }, 9 }, -- Peacekeeper's Coalition
[22] = { 16, 2, 5001, { -77.944, -0.15, -63.926, 0, xi.zone.EASTERN_ADOULIN }, 10 }, -- Scout's Coalition
[23] = { 17, 2, 5002, { -46.838, -0.075, -12.767, 63, xi.zone.EASTERN_ADOULIN }, 11 }, -- Statue of the Goddess
[24] = { 18, 2, 5003, { -57.773, -0.15, 85.237, 127, xi.zone.EASTERN_ADOULIN }, 12 }, -- Yahse Wharf
[25] = { 19, 2, 5004, { -61.865, -0.15, -120.81, 127, xi.zone.EASTERN_ADOULIN }, 13 }, -- Rent-a-Room
[26] = { 20, 2, 5005, { -42.065, -0.15, -89.979, 191, xi.zone.EASTERN_ADOULIN }, 14 }, -- Auction House
[27] = { 21, 2, 5006, { 11.681, -22.15, 29.976, 127, xi.zone.EASTERN_ADOULIN }, 15 }, -- Sverdhried Hillock
[28] = { 22, 2, 5007, { 27.124, -40.15, -60.844, 127, xi.zone.EASTERN_ADOULIN }, 16 }, -- Coronal Esplanade
[29] = { 23, 2, 5008, { 95.994, -40.15, -74.541, 0, xi.zone.EASTERN_ADOULIN }, 17 }, -- Castle Gates

-- Yahse Hunting Grounds
[31] = { 38, 4, 5000, { 321, 0, -199.8, 127, xi.zone.YAHSE_HUNTING_GROUNDS } }, -- Frontier Station
[32] = { 39, 4, 5001, { 86.5, 0, 1.5, 0, xi.zone.YAHSE_HUNTING_GROUNDS } }, -- Bivouac #1
[33] = { 40, 4, 5002, { -286.5, 0, 43.5, 127, xi.zone.YAHSE_HUNTING_GROUNDS } }, -- Bivouac #2
[34] = { 41, 4, 5003, { -162.4, 0, -272.8, 191, xi.zone.YAHSE_HUNTING_GROUNDS } }, -- Bivouac #3
[31] = { 38, 4, 5000, { 321, 0, -199.8, 127, xi.zone.YAHSE_HUNTING_GROUNDS }, 22 }, -- Frontier Station
[32] = { 39, 4, 5001, { 86.5, 0, 1.5, 0, xi.zone.YAHSE_HUNTING_GROUNDS }, 23 }, -- Bivouac #1
[33] = { 40, 4, 5002, { -286.5, 0, 43.5, 127, xi.zone.YAHSE_HUNTING_GROUNDS }, 24 }, -- Bivouac #2
[34] = { 41, 4, 5003, { -162.4, 0, -272.8, 191, xi.zone.YAHSE_HUNTING_GROUNDS }, 25 }, -- Bivouac #3

-- Ceizak Battlegrounds
[41] = { 32, 3, 5000, { 365, 0.448, 190, 128, xi.zone.CEIZAK_BATTLEGROUNDS } }, -- Frontier Station
[42] = { 33, 3, 5001, { -6.879, 0, -117.511, 63, xi.zone.CEIZAK_BATTLEGROUNDS } }, -- Bivouac #1
[43] = { 34, 3, 5002, { -42, 0, 155, 191, xi.zone.CEIZAK_BATTLEGROUNDS } }, -- Bivouac #2
[44] = { 35, 3, 5003, { -442, 0, -247, 191, xi.zone.CEIZAK_BATTLEGROUNDS } }, -- Bivouac #3
[41] = { 32, 3, 5000, { 365, 0.448, 190, 128, xi.zone.CEIZAK_BATTLEGROUNDS }, 18 }, -- Frontier Station
[42] = { 33, 3, 5001, { -6.879, 0, -117.511, 63, xi.zone.CEIZAK_BATTLEGROUNDS }, 19 }, -- Bivouac #1
[43] = { 34, 3, 5002, { -42, 0, 155, 191, xi.zone.CEIZAK_BATTLEGROUNDS }, 20 }, -- Bivouac #2
[44] = { 35, 3, 5003, { -442, 0, -247, 191, xi.zone.CEIZAK_BATTLEGROUNDS }, 21 }, -- Bivouac #3

-- Foret de Hennetiel
[51] = { 64, 5, 5000, { 398.11, -2, 279.11, 0, xi.zone.FORET_DE_HENNETIEL } }, -- Frontier Station
[52] = { 65, 5, 5001, { 12.6, -2.4, 342, 0, xi.zone.FORET_DE_HENNETIEL } }, -- Bivouac #1
[53] = { 66, 5, 5002, { 505, -2.25, -303.5, 127, xi.zone.FORET_DE_HENNETIEL } }, -- Bivouac #2
[54] = { 67, 5, 5003, { 103, -2.2, -92.3, 63, xi.zone.FORET_DE_HENNETIEL } }, -- Bivouac #3
[55] = { 68, 5, 5004, { -251.8, -2.37, -39.25, 63, xi.zone.FORET_DE_HENNETIEL } }, -- Bivouac #4
[51] = { 64, 5, 5000, { 398.11, -2, 279.11, 0, xi.zone.FORET_DE_HENNETIEL }, 26 }, -- Frontier Station
[52] = { 65, 5, 5001, { 12.6, -2.4, 342, 0, xi.zone.FORET_DE_HENNETIEL }, 27 }, -- Bivouac #1
[53] = { 66, 5, 5002, { 505, -2.25, -303.5, 127, xi.zone.FORET_DE_HENNETIEL }, 28 }, -- Bivouac #2
[54] = { 67, 5, 5003, { 103, -2.2, -92.3, 63, xi.zone.FORET_DE_HENNETIEL }, 29 }, -- Bivouac #3
[55] = { 68, 5, 5004, { -251.8, -2.37, -39.25, 63, xi.zone.FORET_DE_HENNETIEL }, 30 }, -- Bivouac #4

-- Morimar Basalt Fields
[61] = { 70, 6, 5000, { 443.728, -16, -325.428, 191, xi.zone.MORIMAR_BASALT_FIELDS } }, -- Frontier Station
[62] = { 71, 6, 5001, { 368, -16, 37.5, 127, xi.zone.MORIMAR_BASALT_FIELDS } }, -- Bivouac #1
[63] = { 72, 6, 5002, { 112.8, -0.483, 324.4, 63, xi.zone.MORIMAR_BASALT_FIELDS } }, -- Bivouac #2
[64] = { 73, 6, 5003, { 175.5, -15.581, -318.2, 127, xi.zone.MORIMAR_BASALT_FIELDS } }, -- Bivouac #3
[65] = { 74, 6, 5004, { -323, -32, 2, 63, xi.zone.MORIMAR_BASALT_FIELDS } }, -- Bivouac #4
[66] = { 75, 6, 5005, { -78.2, -47.284, 303, 191, xi.zone.MORIMAR_BASALT_FIELDS } }, -- Bivouac #5
[61] = { 70, 6, 5000, { 443.728, -16, -325.428, 191, xi.zone.MORIMAR_BASALT_FIELDS }, 31 }, -- Frontier Station
[62] = { 71, 6, 5001, { 368, -16, 37.5, 127, xi.zone.MORIMAR_BASALT_FIELDS }, 32 }, -- Bivouac #1
[63] = { 72, 6, 5002, { 112.8, -0.483, 324.4, 63, xi.zone.MORIMAR_BASALT_FIELDS }, 33 }, -- Bivouac #2
[64] = { 73, 6, 5003, { 175.5, -15.581, -318.2, 127, xi.zone.MORIMAR_BASALT_FIELDS }, 34 }, -- Bivouac #3
[65] = { 74, 6, 5004, { -323, -32, 2, 63, xi.zone.MORIMAR_BASALT_FIELDS }, 35 }, -- Bivouac #4
[66] = { 75, 6, 5005, { -78.2, -47.284, 303, 191, xi.zone.MORIMAR_BASALT_FIELDS }, 36 }, -- Bivouac #5

-- Yorcia Weald
[71] = { 96, 7, 5000, { 353.3, 0.2, 153.3, 223, xi.zone.YORCIA_WEALD } }, -- Frontier Station
[72] = { 97, 7, 5001, { -40.5, 0.367, 296.367, 0, xi.zone.YORCIA_WEALD } }, -- Bivouac #1
[73] = { 98, 7, 5002, { 122.132, 0.146, -287.731, 127, xi.zone.YORCIA_WEALD } }, -- Bivouac #2
[74] = { 99, 7, 5003, { -274.776, 0.357, 85.376, 127, xi.zone.YORCIA_WEALD } }, -- Bivouac #3
[71] = { 96, 7, 5000, { 353.3, 0.2, 153.3, 223, xi.zone.YORCIA_WEALD }, 37 }, -- Frontier Station
[72] = { 97, 7, 5001, { -40.5, 0.367, 296.367, 0, xi.zone.YORCIA_WEALD }, 38 }, -- Bivouac #1
[73] = { 98, 7, 5002, { 122.132, 0.146, -287.731, 127, xi.zone.YORCIA_WEALD }, 39 }, -- Bivouac #2
[74] = { 99, 7, 5003, { -274.776, 0.357, 85.376, 127, xi.zone.YORCIA_WEALD }, 40 }, -- Bivouac #3

-- Marjami Ravine
[81] = { 102, 8, 5000, { 358, -60, 165, 63, xi.zone.MARJAMI_RAVINE } }, -- Frontier Station
[82] = { 103, 8, 5001, { 323, -20, -79, 0, xi.zone.MARJAMI_RAVINE } }, -- Bivouac #1
[83] = { 104, 8, 5002, { 6.808, 0, 78.437, 191, xi.zone.MARJAMI_RAVINE } }, -- Bivouac #2
[84] = { 105, 8, 5003, { -318.708, -20, -127.275, 63, xi.zone.MARJAMI_RAVINE } }, -- Bivouac #3
[85] = { 106, 8, 5004, { -326.022, -40.023, 201.096, 191, xi.zone.MARJAMI_RAVINE } }, -- Bivouac #4
[81] = { 102, 8, 5000, { 358, -60, 165, 63, xi.zone.MARJAMI_RAVINE }, 41 }, -- Frontier Station
[82] = { 103, 8, 5001, { 323, -20, -79, 0, xi.zone.MARJAMI_RAVINE }, 42 }, -- Bivouac #1
[83] = { 104, 8, 5002, { 6.808, 0, 78.437, 191, xi.zone.MARJAMI_RAVINE }, 43 }, -- Bivouac #2
[84] = { 105, 8, 5003, { -318.708, -20, -127.275, 63, xi.zone.MARJAMI_RAVINE }, 44 }, -- Bivouac #3
[85] = { 106, 8, 5004, { -326.022, -40.023, 201.096, 191, xi.zone.MARJAMI_RAVINE }, 45 }, -- Bivouac #4

-- Kamihr Drifts
[91] = { 134, 9, 5000, { 439.403, 63, -272.554, 63, xi.zone.KAMIHR_DRIFTS } }, -- Frontier Station
[92] = { 135, 9, 5001, { -42.574, 43, -71.319, 0, xi.zone.KAMIHR_DRIFTS } }, -- Bivouac #1
[93] = { 136, 9, 5002, { 8.24, 43, -283.017, 191, xi.zone.KAMIHR_DRIFTS } }, -- Bivouac #2
[94] = { 137, 9, 5003, { 9.24, 23, 162.803, 63, xi.zone.KAMIHR_DRIFTS } }, -- Bivouac #3
[95] = { 138, 9, 5004, { -228.942, 3.567, 364.512, 127, xi.zone.KAMIHR_DRIFTS } }, -- Bivouac #4
[91] = { 134, 9, 5000, { 439.403, 63, -272.554, 63, xi.zone.KAMIHR_DRIFTS }, 46 }, -- Frontier Station
[92] = { 135, 9, 5001, { -42.574, 43, -71.319, 0, xi.zone.KAMIHR_DRIFTS }, 47 }, -- Bivouac #1
[93] = { 136, 9, 5002, { 8.24, 43, -283.017, 191, xi.zone.KAMIHR_DRIFTS }, 48 }, -- Bivouac #2
[94] = { 137, 9, 5003, { 9.24, 23, 162.803, 63, xi.zone.KAMIHR_DRIFTS }, 49 }, -- Bivouac #3
[95] = { 138, 9, 5004, { -228.942, 3.567, 364.512, 127, xi.zone.KAMIHR_DRIFTS }, 50 }, -- Bivouac #4

-- Jeuno (Special case, Default Active, uses multiple options)
[100] = { nil, 10, 10121, { -33.550, 0, -31.840, 150, xi.zone.LOWER_JEUNO } },
Expand All @@ -113,12 +114,27 @@ local waypointInfo =
[210] = { nil, nil, nil, { 13.202, -3.675, -453.439, 128, xi.zone.CAEDARVA_MIRE } }, -- Nashmau (Caedarva Mire)

-- Enigmatic Devices (One-way, so event should never be called)
[300] = { 128, 11, nil, { -588, -7.5, 19, 192, xi.zone.RALA_WATERWAYS } }, -- Rala Waterways
[301] = { 129, 11, nil, { -108.288, 4, -12.370, 151, xi.zone.CIRDAS_CAVERNS } }, -- Cirdas Caverns
[302] = { 130, 11, nil, { 171, 4.47, -259, 128, xi.zone.YORCIA_WEALD } }, -- Yorcia Weald
[303] = { 131, 11, nil, { -148, -170, 27, 192, xi.zone.OUTER_RAKAZNAR } }, -- Outer Ra'Kaznar
-- NOTE: These are stored at the end of the teleport table internally, and are not displayed as map markers
[300] = { 128, 11, nil, { -588, -7.5, 19, 192, xi.zone.RALA_WATERWAYS }, 51 }, -- Rala Waterways
[301] = { 129, 11, nil, { -108.288, 4, -12.370, 151, xi.zone.CIRDAS_CAVERNS }, 52 }, -- Cirdas Caverns
[302] = { 130, 11, nil, { 171, 4.47, -259, 128, xi.zone.YORCIA_WEALD }, 53 }, -- Yorcia Weald
[303] = { 131, 11, nil, { -148, -170, 27, 192, xi.zone.OUTER_RAKAZNAR }, 54 }, -- Outer Ra'Kaznar
}

local function buildTeleportLookup()
local tableLookup = {}

for waypointIndex, waypointData in pairs(waypointInfo) do
if waypointData[5] then
tableLookup[waypointData[5]] = waypointIndex
end
end

return tableLookup
end

local tableIndexToWaypoint = buildTeleportLookup()

local runeKeyItems =
{
xi.ki.SAN_DORIA_WARP_RUNE,
Expand Down Expand Up @@ -170,13 +186,48 @@ local function getWaypointIndex(npcObj)

for indexVal, npcData in ipairs(waypointList) do
if npcData:getID() == waypointNpcId then
return waypointStartIndex[zoneObject:getID()] + indexVal
local resultIndex = indexVal
-- NOTE: Western Adoulin Auction House and Rent-a-Room are special cases where
-- the NPC ID order does not follow Waypoint data order. The below is a workaround
-- for that exception
if zoneObject:getID() == xi.zone.WESTERN_ADOULIN then
if indexVal == 5 then
resultIndex = 6
elseif indexVal == 6 then
resultIndex = 5
end
end

return waypointStartIndex[zoneObject:getID()] + resultIndex
end
end

return nil
end

-- Teleports are stored in an array of uint32, but referenced in-game using multiple
-- methods. This will return a table of 5 parameters corresponding to what the event
-- onTrigger uses.
local function getUnlockedWaypointParameters(player)
local unlockedWaypoints = player:getTeleportTable(xi.teleport.type.WAYPOINT)
local parameterTable = { 0, 0, 0, 0, 0 }

for indexVal, waypointField in ipairs(unlockedWaypoints) do
for bitPos = 0, 31 do
if bit.band(bit.rshift(waypointField, bitPos), 1) == 1 then
local waypointIndex = tableIndexToWaypoint[32 * (indexVal - 1) + bitPos]
local waypointOffset = waypointInfo[waypointIndex][1]
local parameterIndex = math.floor(waypointOffset / 32) + 1
local parameterBitPos = waypointOffset % 32

parameterTable[parameterIndex] = utils.mask.setBit(parameterTable[parameterIndex], parameterBitPos, true)
end
end
end

return parameterTable
end

local function getRuneMask(player)
local resultMask = utils.MAX_UINT32 - 1

Expand Down Expand Up @@ -234,9 +285,9 @@ xi.waypoint.onTrigger = function(player, npc)

if
zoneId == xi.zone.LOWER_JEUNO or
player:hasTeleport(xi.teleport.type.WAYPOINT, waypointInfo[waypointIndex][1])
player:hasTeleport(xi.teleport.type.WAYPOINT, waypointInfo[waypointIndex][5])
then
local unlockedWaypoints = player:getTeleportTable(xi.teleport.type.WAYPOINT)
local unlockedWaypoints = getUnlockedWaypointParameters(player)
local destConfirmation = player:getTeleportMenu(xi.teleport.type.WAYPOINT)[1] and 1 or 0

-- Note: The '4' Value is setting the discount value for waypoints, which appears to always
Expand Down Expand Up @@ -267,7 +318,7 @@ xi.waypoint.onTrigger = function(player, npc)
elseif zoneId ~= xi.zone.LOWER_JEUNO then
local ID = zones[zoneId]

player:addTeleport(xi.teleport.type.WAYPOINT, waypointInfo[waypointIndex][1])
player:addTeleport(xi.teleport.type.WAYPOINT, waypointInfo[waypointIndex][5])
player:messageSpecial(ID.text.WAYPOINT_ATTUNED, waypointIndex - waypointStartIndex[zoneId], xi.ki.GEOMAGNETRON)
end
end
Expand Down
2 changes: 1 addition & 1 deletion src/map/entities/charentity.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ struct telepoint_t

struct waypoint_t
{
uint32 access[5];
uint32 access[2];
bool confirmation;

waypoint_t()
Expand Down
2 changes: 1 addition & 1 deletion src/map/lua/lua_baseentity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3150,7 +3150,7 @@ sol::table CLuaBaseEntity::getTeleportTable(uint8 type)
return teleTable;
break;
case TELEPORT_TYPE::WAYPOINT:
for (uint8 x = 0; x < 5; x++)
for (uint8 x = 0; x < 2; x++)
{
teleTable.add(PChar->teleport.waypoints.access[x]);
}
Expand Down
6 changes: 5 additions & 1 deletion src/map/packets/map_marker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,5 +51,9 @@ CMapMarkerPacket::CMapMarkerPacket(CCharEntity* PChar)
ref<uint16>(0x24) = PChar->teleport.survival.access[3] & 0xFFFF;
ref<uint16>(0x26) = (PChar->teleport.survival.access[3] & 0xFFFF0000) >> 16;

// TODO: Abyssea Maws, Waypoints
// TODO: Abyssea Maws
ref<uint16>(0x28) = PChar->teleport.waypoints.access[0] & 0xFFFF;
ref<uint16>(0x2A) = (PChar->teleport.waypoints.access[0] & 0xFFFF0000) >> 16;
ref<uint16>(0x2C) = PChar->teleport.waypoints.access[1] & 0xFFFF;
ref<uint16>(0x2E) = (PChar->teleport.waypoints.access[1] & 0x00070000) >> 16;
}