Skip to content

Commit

Permalink
implement teleportation via aetheryte ticket
Browse files Browse the repository at this point in the history
  • Loading branch information
pinapelz committed May 17, 2024
1 parent 989630b commit 66707a0
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 7 deletions.
1 change: 1 addition & 0 deletions src/common/Common.h
Original file line number Diff line number Diff line change
Expand Up @@ -1790,6 +1790,7 @@ namespace Sapphire::Common
{
uint16_t targetAetheryte;
uint16_t cost;
bool useAetheryteTicket{ false };
};

enum EventSceneError : uint8_t
Expand Down
1 change: 1 addition & 0 deletions src/scripts/action/common/ActionTeleport5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class ActionTeleport5 : public Sapphire::ScriptAPI::ActionScript
auto teleportQuery = pPlayer->getTeleportQuery();

if( pPlayer->getCurrency( Common::CurrencyType::Gil ) < teleportQuery.cost ||
teleportQuery.useAetheryteTicket && !pPlayer->removeItem( 7569 ) ||
teleportQuery.targetAetheryte == 0 )
{
action.interrupt();
Expand Down
10 changes: 6 additions & 4 deletions src/world/Actor/Player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1367,7 +1367,7 @@ bool Player::isDirectorInitialized() const
return m_directorInitialized;
}

void Player::teleportQuery( uint16_t aetheryteId )
void Player::teleportQuery( uint16_t aetheryteId, bool useAetheryteTicket )
{
auto& exdData = Common::Service< Data::ExdData >::ref();
// TODO: only register this action if enough gil is in possession
Expand All @@ -1378,10 +1378,11 @@ void Player::teleportQuery( uint16_t aetheryteId )

auto fromAetheryte = exdData.getRow< Excel::Aetheryte >( exdData.getRow< Excel::TerritoryType >( getTerritoryTypeId() )->data().Aetheryte );

// calculate cost - does not apply for favorite points or homepoints neither checks for aether tickets
auto cost = static_cast< uint16_t > (
// calculate cost - does not apply for favorite points or homepoints
// if using aetheryte ticket, cost is 0
auto cost = useAetheryteTicket ? 0 : static_cast<uint16_t>(
( std::sqrt( std::pow( fromAetheryte->data().CostPosX - targetAetheryte->data().CostPosX, 2 ) +
std::pow( fromAetheryte->data().CostPosY - targetAetheryte->data().CostPosY, 2 ) ) / 2 ) + 100 );
std::pow( fromAetheryte->data().CostPosY - targetAetheryte->data().CostPosY, 2 )) / 2 ) + 100 );

// cap at 999 gil
cost = std::min< uint16_t >( 999, cost );
Expand All @@ -1393,6 +1394,7 @@ void Player::teleportQuery( uint16_t aetheryteId )
{
m_teleportQuery.targetAetheryte = aetheryteId;
m_teleportQuery.cost = cost;
m_teleportQuery.useAetheryteTicket = useAetheryteTicket;
}
else
{
Expand Down
2 changes: 1 addition & 1 deletion src/world/Actor/Player.h
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ namespace Sapphire::Entity
uint64_t getFullOnlineStatusMask() const;

/*! query teleport of a specified type */
void teleportQuery( uint16_t aetheryteId );
void teleportQuery( uint16_t aetheryteId, bool useAetheryteTicket );

Common::PlayerTeleportQuery getTeleportQuery() const;

Expand Down
5 changes: 3 additions & 2 deletions src/world/Network/Handlers/PacketCommandHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -607,8 +607,9 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
}
case PacketCommand::TELEPO_INQUIRY: // Teleport
{

player.teleportQuery( static_cast< uint16_t >( data.Arg0 ) );
// data.Arg0 = aetheryte id
// data.Arg1 = confirm or cancel if using aetheryte ticket
player.teleportQuery( static_cast< uint16_t >( data.Arg0 ), data.Arg1 == 1 );
break;
}
case PacketCommand::DYE_ITEM: // Dye item
Expand Down

0 comments on commit 66707a0

Please sign in to comment.