1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-26 14:37:44 +00:00
sapphire/src/world/Actor/PlayerQuest.cpp

1096 lines
25 KiB
C++
Raw Normal View History

2018-03-06 22:22:19 +01:00
#include <Common.h>
#include <Network/PacketDef/Zone/ServerZoneDef.h>
#include <Exd/ExdDataGenerated.h>
#include <Network/PacketContainer.h>
2020-03-01 01:00:57 +11:00
#include <Service.h>
2017-08-08 13:53:47 +02:00
#include "Network/GameConnection.h"
#include "Network/PacketWrappers/QuestMessagePacket.h"
2017-08-08 13:53:47 +02:00
#include "Session.h"
2017-08-08 13:53:47 +02:00
using namespace Sapphire::Common;
using namespace Sapphire::Network::Packets;
using namespace Sapphire::Network::Packets::Server;
2017-08-08 13:53:47 +02:00
void Sapphire::Entity::Player::finishQuest( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
removeQuest( questId );
2017-08-08 13:53:47 +02:00
auto questFinishPacket = makeZonePacket< FFXIVIpcQuestFinish >( getId() );
questFinishPacket->data().questId = questId;
questFinishPacket->data().flag1 = 1;
questFinishPacket->data().flag2 = 1;
queuePacket( questFinishPacket );
updateQuestsCompleted( questId );
2017-08-08 13:53:47 +02:00
//sendQuestTracker(); already sent in removeQuest()
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::unfinishQuest( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
removeQuestsCompleted( questId );
sendQuestInfo();
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::removeQuest( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( ( idx != -1 ) && ( m_activeQuests[ idx ] != nullptr ) )
{
auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() );
questUpdatePacket->data().slot = static_cast< uint8_t >( idx );
questUpdatePacket->data().questInfo.c.questId = 0;
questUpdatePacket->data().questInfo.c.sequence = 0xFF;
queuePacket( questUpdatePacket );
2017-08-08 13:53:47 +02:00
for( int32_t ii = 0; ii < 5; ii++ )
{
if( m_questTracking[ ii ] == idx )
m_questTracking[ ii ] = -1;
}
2017-08-08 13:53:47 +02:00
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pQuest = m_activeQuests[ idx ];
m_activeQuests[ idx ].reset();
2017-08-08 13:53:47 +02:00
m_questIdToQuestIdx.erase( questId );
m_questIdxToQuestId.erase( idx );
deleteQuest( questId );
}
2017-08-08 13:53:47 +02:00
sendQuestTracker();
2017-08-08 13:53:47 +02:00
}
bool Sapphire::Entity::Player::hasQuest( uint32_t questId )
2017-08-08 13:53:47 +02:00
{
return ( getQuestIndex( static_cast< uint16_t >( questId ) ) > -1 );
2017-08-08 13:53:47 +02:00
}
int8_t Sapphire::Entity::Player::getQuestIndex( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
auto it = m_questIdToQuestIdx.find( questId );
if( it != m_questIdToQuestIdx.end() )
return it->second;
2017-08-08 13:53:47 +02:00
return -1;
2017-08-08 13:53:47 +02:00
}
bool Sapphire::Entity::Player::getQuestBitFlag8( uint16_t questId, uint8_t index )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
return pNewQuest->a.BitFlag8 & ( 1 << index );
}
2017-08-08 13:53:47 +02:00
return false;
2017-08-08 13:53:47 +02:00
}
bool Sapphire::Entity::Player::getQuestBitFlag16( uint16_t questId, uint8_t index )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
return pNewQuest->a.BitFlag16 & ( 1 << index );
}
2017-08-08 13:53:47 +02:00
return false;
2017-08-08 13:53:47 +02:00
}
bool Sapphire::Entity::Player::getQuestBitFlag24( uint16_t questId, uint8_t index )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
return pNewQuest->a.BitFlag24 & ( 1 << index );
}
2017-08-08 13:53:47 +02:00
return false;
2017-08-08 13:53:47 +02:00
}
bool Sapphire::Entity::Player::getQuestBitFlag32( uint16_t questId, uint8_t index )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
return pNewQuest->a.BitFlag32 & ( 1 << index );
}
2017-08-08 13:53:47 +02:00
return false;
2017-08-08 13:53:47 +02:00
}
bool Sapphire::Entity::Player::getQuestBitFlag40( uint16_t questId, uint8_t index )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
return pNewQuest->a.BitFlag40 & ( 1 << index );
}
2017-08-08 13:53:47 +02:00
return false;
2017-08-08 13:53:47 +02:00
}
bool Sapphire::Entity::Player::getQuestBitFlag48( uint16_t questId, uint8_t index )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
return pNewQuest->a.BitFlag48 & ( 1 << index );
}
2017-08-08 13:53:47 +02:00
return false;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8A( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->c.UI8A;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8B( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->c.UI8B;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8C( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->c.UI8C;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8D( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->c.UI8D;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8E( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->c.UI8E;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8F( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->c.UI8F;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8AH( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8AH;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8BH( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8BH;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8CH( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8CH;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8DH( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8DH;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8EH( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8EH;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8FH( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8FH;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8AL( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8AL;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8BL( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8BL;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8CL( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8CL;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8DL( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8DL;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8EL( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8EL;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestUI8FL( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint8_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
value = pNewQuest->b.UI8FL;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint16_t Sapphire::Entity::Player::getQuestUI16A( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint16_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
// value = pNewQuest->d.UI16A;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint16_t Sapphire::Entity::Player::getQuestUI16B( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint16_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
// value = pNewQuest->d.UI16B;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint16_t Sapphire::Entity::Player::getQuestUI16C( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint16_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
// value = pNewQuest->d.UI16C;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
uint32_t Sapphire::Entity::Player::getQuestUI32A( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
uint32_t value = 0;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
// value = pNewQuest->e.UI32A;
}
2017-08-08 13:53:47 +02:00
return value;
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8A( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->c.UI8A = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8B( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->c.UI8B = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8C( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->c.UI8C = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8D( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->c.UI8D = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8E( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->c.UI8E = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8F( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->c.UI8F = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8AH( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8AH = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8BH( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8BH = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8CH( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8CH = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8DH( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8DH = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8EH( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8EH = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8FH( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8FH = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8AL( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8AL = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8BL( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8BL = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8CL( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8CL = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8DL( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8DL = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8EL( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8EL = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI8FL( uint16_t questId, uint8_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
pNewQuest->b.UI8FL = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI16A( uint16_t questId, uint16_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
// pNewQuest->d.UI16A = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI16B( uint16_t questId, uint16_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
// pNewQuest->d.UI16B = val;
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI16C( uint16_t questId, uint16_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
// pNewQuest->d.UI16C = val;
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestUI32A( uint16_t questId, uint32_t val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
// pNewQuest->e.UI32A = val;
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestBitFlag8( uint16_t questId, uint8_t index, bool val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
uint8_t realIdx = 8 - index;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
if( val )
pNewQuest->a.BitFlag8 |= ( 1 << realIdx );
else
pNewQuest->a.BitFlag8 &= ~( 1 << realIdx );
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestBitFlag16( uint16_t questId, uint8_t index, bool val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
uint8_t realIdx = 8 - index;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
if( val )
pNewQuest->a.BitFlag16 |= ( 1 << realIdx );
else
pNewQuest->a.BitFlag16 &= ~( 1 << realIdx );
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestBitFlag24( uint16_t questId, uint8_t index, bool val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
uint8_t realIdx = 8 - index;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
if( val )
pNewQuest->a.BitFlag24 |= ( 1 << realIdx );
else
pNewQuest->a.BitFlag24 &= ~( 1 << realIdx );
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestBitFlag32( uint16_t questId, uint8_t index, bool val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
uint8_t realIdx = 8 - index;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
if( val )
pNewQuest->a.BitFlag32 |= ( 1 << realIdx );
else
pNewQuest->a.BitFlag32 &= ~( 1 << realIdx );
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestBitFlag40( uint16_t questId, uint8_t index, bool val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
uint8_t realIdx = 8 - index;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
if( val )
pNewQuest->a.BitFlag40 |= ( 1 << realIdx );
else
pNewQuest->a.BitFlag40 &= ~( 1 << realIdx );
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestBitFlag48( uint16_t questId, uint8_t index, bool val )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
uint8_t realIdx = 8 - index;
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
2017-08-08 13:53:47 +02:00
if( val )
pNewQuest->a.BitFlag48 |= ( 1 << realIdx );
else
pNewQuest->a.BitFlag48 &= ~( 1 << realIdx );
2017-08-08 13:53:47 +02:00
updateQuest( questId, pNewQuest->c.sequence );
}
2017-08-08 13:53:47 +02:00
}
uint8_t Sapphire::Entity::Player::getQuestSeq( uint16_t questId )
2017-08-08 13:53:47 +02:00
{
int8_t idx = getQuestIndex( questId );
2017-08-08 13:53:47 +02:00
if( idx != -1 )
{
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest = m_activeQuests[ idx ];
return pNewQuest->c.sequence;
}
return 0;
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::updateQuest( uint16_t questId, uint8_t sequence )
2017-08-08 13:53:47 +02:00
{
if( hasQuest( questId ) )
{
uint8_t index = getQuestIndex( questId );
auto pNewQuest = m_activeQuests[ index ];
auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() );
pNewQuest->c.sequence = sequence;
questUpdatePacket->data().slot = index;
questUpdatePacket->data().questInfo = *pNewQuest;
queuePacket( questUpdatePacket );
}
else
{
uint8_t idx = 0;
bool hasFreeSlot = false;
for( ; idx < 30; idx++ )
if( !m_activeQuests[ idx ] )
{
hasFreeSlot = true;
break;
}
if( !hasFreeSlot )
return;
2018-10-25 12:44:51 +11:00
std::shared_ptr< QuestActive > pNewQuest( new QuestActive() );
pNewQuest->c.questId = questId;
pNewQuest->c.sequence = sequence;
pNewQuest->c.padding = 0;
m_activeQuests[ idx ] = pNewQuest;
m_questIdToQuestIdx[ questId ] = idx;
m_questIdxToQuestId[ idx ] = questId;
auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() );
questUpdatePacket->data().slot = idx;
questUpdatePacket->data().questInfo = *pNewQuest;
queuePacket( questUpdatePacket );
for( int32_t ii = 0; ii < 5; ii++ )
{
if( m_questTracking[ ii ] == -1 )
2017-08-08 13:53:47 +02:00
{
m_questTracking[ ii ] = idx;
break;
2017-08-08 13:53:47 +02:00
}
}
2017-08-08 13:53:47 +02:00
insertQuest( questId, idx, sequence );
sendQuestTracker();
2017-08-08 13:53:47 +02:00
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::sendQuestTracker()
2017-08-08 13:53:47 +02:00
{
auto trackerPacket = makeZonePacket< FFXIVIpcQuestTracker >( getId() );
2017-08-08 13:53:47 +02:00
for( int32_t ii = 0; ii < 5; ii++ )
{
if( m_questTracking[ ii ] >= 0 )
{
trackerPacket->data().entry[ ii ].active = 1;
trackerPacket->data().entry[ ii ].questIndex = static_cast< uint8_t >( m_questTracking[ ii ] );
}
}
queuePacket( trackerPacket );
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::setQuestTracker( uint16_t index, int16_t flag )
2017-08-08 13:53:47 +02:00
{
if( flag == 0 )
{
//remove
for( uint8_t ii = 0; ii < 5; ii++ )
{
if( m_questTracking[ ii ] == index )
2017-08-08 13:53:47 +02:00
{
m_questTracking[ ii ] = -1;
break;
2017-08-08 13:53:47 +02:00
}
}
}
else
{
//add
for( uint8_t ii = 0; ii < 5; ii++ )
{
if( m_questTracking[ ii ] == -1 )
2017-08-08 13:53:47 +02:00
{
m_questTracking[ ii ] = index;
break;
2017-08-08 13:53:47 +02:00
}
}
}
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::sendQuestInfo()
2017-08-08 13:53:47 +02:00
{
auto activeQuestListPacket = makeZonePacket< FFXIVIpcQuestActiveList >( getId() );
2017-08-08 13:53:47 +02:00
for( int32_t i = 0; i < 30; i++ )
{
uint8_t offset = i * 12;
if( m_activeQuests[ i ] != nullptr )
{
2017-08-08 13:53:47 +02:00
auto& quest = activeQuestListPacket->data().activeQuests[ i ];
quest = *m_activeQuests[ i ];
2017-08-08 13:53:47 +02:00
}
}
2017-08-08 13:53:47 +02:00
queuePacket( activeQuestListPacket );
2017-08-08 13:53:47 +02:00
auto completeQuestListPacket = makeZonePacket< FFXIVIpcQuestCompleteList >( getId() );
memcpy( completeQuestListPacket->data().questCompleteMask, m_questCompleteFlags, sizeof( m_questCompleteFlags ) );
queuePacket( completeQuestListPacket );
2017-08-08 13:53:47 +02:00
sendQuestTracker();
2017-08-08 13:53:47 +02:00
}
void
Sapphire::Entity::Player::sendQuestMessage( uint32_t questId, int8_t msgId, uint8_t type, uint32_t var1, uint32_t var2 )
2017-08-08 13:53:47 +02:00
{
2018-10-25 12:44:51 +11:00
queuePacket( std::make_shared< QuestMessagePacket >( getAsPlayer(), questId, msgId, type, var1, var2 ) );
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::updateQuestsCompleted( uint32_t questId )
2017-08-08 13:53:47 +02:00
{
uint8_t index = questId / 8;
uint8_t bitIndex = ( questId ) % 8;
2017-08-08 13:53:47 +02:00
uint8_t value = 0x80 >> bitIndex;
2017-08-08 13:53:47 +02:00
m_questCompleteFlags[ index ] |= value;
2017-08-08 13:53:47 +02:00
}
void Sapphire::Entity::Player::removeQuestsCompleted( uint32_t questId )
2017-08-08 13:53:47 +02:00
{
uint8_t index = questId / 8;
uint8_t bitIndex = ( questId ) % 8;
2017-08-08 13:53:47 +02:00
uint8_t value = 0x80 >> bitIndex;
2017-08-08 13:53:47 +02:00
m_questCompleteFlags[ index ] ^= value;
2017-08-08 13:53:47 +02:00
}
bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t optionalChoice )
2017-08-08 13:53:47 +02:00
{
2020-03-01 01:00:57 +11:00
auto& exdData = Common::Service< Data::ExdDataGenerated >::ref();
uint32_t playerLevel = getLevel();
2020-03-01 01:00:57 +11:00
auto questInfo = exdData.get< Sapphire::Data::Quest >( questId );
2017-08-08 13:53:47 +02:00
if( !questInfo )
return false;
2017-08-08 13:53:47 +02:00
2020-03-01 01:00:57 +11:00
auto paramGrowth = exdData.get< Sapphire::Data::ParamGrow >( questInfo->classJobLevel0 );
2017-08-08 13:53:47 +02:00
// TODO: use the correct formula, this one is wrong
uint32_t exp =
( questInfo->expFactor * paramGrowth->questExpModifier * ( 45 + 5 * questInfo->classJobLevel0 ) ) / 100;
2017-08-08 13:53:47 +02:00
exp = questInfo->expFactor;
2017-08-08 13:53:47 +02:00
auto rewardItemCount = questInfo->itemReward0.size();
uint16_t optionalItemCount = static_cast< uint16_t >( questInfo->itemReward1.size() );
2017-08-08 13:53:47 +02:00
uint32_t gilReward = questInfo->gilReward;
2017-08-08 13:53:47 +02:00
// TODO: check if there is room in inventory, else return false;
if( exp > 0 )
gainExp( exp );
2017-08-08 13:53:47 +02:00
if( rewardItemCount > 0 )
{
for( uint32_t i = 0; i < rewardItemCount; i++ )
{
addItem( questInfo->itemReward0.at( i ), questInfo->itemCountReward0.at( i ), false, false, true, true );
}
}
2017-08-08 13:53:47 +02:00
if( optionalItemCount > 0 )
{
for( uint32_t i = 0; i < optionalItemCount; i++ )
{
auto itemId = questInfo->itemReward1.at( i );
if( itemId == optionalChoice )
{
addItem( itemId, questInfo->itemCountReward1.at( i ), false, false, true, true );
break;
}
}
}
if( gilReward > 0 )
addCurrency( CurrencyType::Gil, gilReward, true );
2017-08-08 13:53:47 +02:00
return true;
2017-08-08 13:53:47 +02:00
}
std::shared_ptr< QuestActive > Sapphire::Entity::Player::getQuestActive( uint16_t index )
2017-08-08 13:53:47 +02:00
{
return m_activeQuests[ index ];
2017-08-08 13:53:47 +02:00
}