mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-06-07 08:37:45 +00:00
Merge pull request #955 from pinapelz/tp_tix
Implement Aetheryte Tickets
This commit is contained in:
commit
5189042247
6 changed files with 22 additions and 9 deletions
|
@ -1790,6 +1790,7 @@ namespace Sapphire::Common
|
||||||
{
|
{
|
||||||
uint16_t targetAetheryte;
|
uint16_t targetAetheryte;
|
||||||
uint16_t cost;
|
uint16_t cost;
|
||||||
|
bool useAetheryteTicket{ false };
|
||||||
};
|
};
|
||||||
|
|
||||||
enum EventSceneError : uint8_t
|
enum EventSceneError : uint8_t
|
||||||
|
|
|
@ -22,6 +22,7 @@ public:
|
||||||
auto teleportQuery = pPlayer->getTeleportQuery();
|
auto teleportQuery = pPlayer->getTeleportQuery();
|
||||||
|
|
||||||
if( pPlayer->getCurrency( Common::CurrencyType::Gil ) < teleportQuery.cost ||
|
if( pPlayer->getCurrency( Common::CurrencyType::Gil ) < teleportQuery.cost ||
|
||||||
|
teleportQuery.useAetheryteTicket && !pPlayer->removeItem( 7569 ) ||
|
||||||
teleportQuery.targetAetheryte == 0 )
|
teleportQuery.targetAetheryte == 0 )
|
||||||
{
|
{
|
||||||
action.interrupt();
|
action.interrupt();
|
||||||
|
|
|
@ -62,10 +62,18 @@ public:
|
||||||
// eventParam4 (or params[1] if using EventPlay8, which is actually used on retail) anything bigger than 1 will show select instance menu item
|
// eventParam4 (or params[1] if using EventPlay8, which is actually used on retail) anything bigger than 1 will show select instance menu item
|
||||||
eventMgr().playScene( player, eventId, 0, 1, { 1, 2 }, [ this ]( Entity::Player& player, const Event::SceneResult& result )
|
eventMgr().playScene( player, eventId, 0, 1, { 1, 2 }, [ this ]( Entity::Player& player, const Event::SceneResult& result )
|
||||||
{
|
{
|
||||||
if( result.numOfResults == 1 ) // set homepoint
|
if( result.numOfResults == 1 )
|
||||||
{
|
{
|
||||||
player.setHomepoint( result.eventId & 0xFFFF );
|
auto cmd = result.getResult( 0 );
|
||||||
eventMgr().sendEventNotice( player, result.eventId, 2, 0xEA, 0, 0 );
|
if( cmd == 1 ) // set homepoint
|
||||||
|
{
|
||||||
|
player.setHomepoint( result.eventId & 0xFFFF );
|
||||||
|
eventMgr().sendEventNotice( player, result.eventId, 2, 0xEA, 0, 0 );
|
||||||
|
}
|
||||||
|
else if( cmd == 5 )
|
||||||
|
{
|
||||||
|
//TODO: Housing teleport selection
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if( result.numOfResults == 2 ) // aethernet access
|
else if( result.numOfResults == 2 ) // aethernet access
|
||||||
{
|
{
|
||||||
|
|
|
@ -1367,7 +1367,7 @@ bool Player::isDirectorInitialized() const
|
||||||
return m_directorInitialized;
|
return m_directorInitialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::teleportQuery( uint16_t aetheryteId )
|
void Player::teleportQuery( uint16_t aetheryteId, bool useAetheryteTicket )
|
||||||
{
|
{
|
||||||
auto& exdData = Common::Service< Data::ExdData >::ref();
|
auto& exdData = Common::Service< Data::ExdData >::ref();
|
||||||
// TODO: only register this action if enough gil is in possession
|
// TODO: only register this action if enough gil is in possession
|
||||||
|
@ -1378,8 +1378,9 @@ void Player::teleportQuery( uint16_t aetheryteId )
|
||||||
|
|
||||||
auto fromAetheryte = exdData.getRow< Excel::Aetheryte >( exdData.getRow< Excel::TerritoryType >( getTerritoryTypeId() )->data().Aetheryte );
|
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
|
// calculate cost - does not apply for favorite points or homepoints
|
||||||
auto cost = static_cast< uint16_t > (
|
// 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::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 );
|
||||||
|
|
||||||
|
@ -1393,6 +1394,7 @@ void Player::teleportQuery( uint16_t aetheryteId )
|
||||||
{
|
{
|
||||||
m_teleportQuery.targetAetheryte = aetheryteId;
|
m_teleportQuery.targetAetheryte = aetheryteId;
|
||||||
m_teleportQuery.cost = cost;
|
m_teleportQuery.cost = cost;
|
||||||
|
m_teleportQuery.useAetheryteTicket = useAetheryteTicket;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -339,7 +339,7 @@ namespace Sapphire::Entity
|
||||||
uint64_t getFullOnlineStatusMask() const;
|
uint64_t getFullOnlineStatusMask() const;
|
||||||
|
|
||||||
/*! query teleport of a specified type */
|
/*! query teleport of a specified type */
|
||||||
void teleportQuery( uint16_t aetheryteId );
|
void teleportQuery( uint16_t aetheryteId, bool useAetheryteTicket );
|
||||||
|
|
||||||
Common::PlayerTeleportQuery getTeleportQuery() const;
|
Common::PlayerTeleportQuery getTeleportQuery() const;
|
||||||
|
|
||||||
|
|
|
@ -607,8 +607,9 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_
|
||||||
}
|
}
|
||||||
case PacketCommand::TELEPO_INQUIRY: // Teleport
|
case PacketCommand::TELEPO_INQUIRY: // Teleport
|
||||||
{
|
{
|
||||||
|
// data.Arg0 = aetheryte id
|
||||||
player.teleportQuery( static_cast< uint16_t >( data.Arg0 ) );
|
// data.Arg1 = confirm or cancel if using aetheryte ticket
|
||||||
|
player.teleportQuery( static_cast< uint16_t >( data.Arg0 ), data.Arg1 == 1 );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PacketCommand::DYE_ITEM: // Dye item
|
case PacketCommand::DYE_ITEM: // Dye item
|
||||||
|
|
Loading…
Add table
Reference in a new issue