1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-07 03:07:45 +00:00

Sql updates now happen on a timer per player instead of controlled by flags

This commit is contained in:
Mordred 2017-10-04 00:02:16 +02:00
parent 8cdb70cf31
commit ac0a935885
14 changed files with 87 additions and 268 deletions

View file

@ -275,35 +275,6 @@ namespace Core {
};
enum PlayerSyncFlags : uint32_t
{
None = 0x00000000,
Position = 0x00000001, // x,y,z,zone
Status = 0x00000002, // hp,mp,tp,class
Look = 0x00000004, // models to display
ExpLevel = 0x00000008, // exp,level
Quests = 0x00000010, // quest status
Achievements = 0x00000020, // achievements
Discovery = 0x00000040, // Discovered places
Aetherytes = 0x00000080, // Attuned aetherytes
HomePoint = 0x00000100, // Current homepoint
HowTo = 0x00000200,
HpMp = 0x00000800,
QuestTracker = 0x00001000,
NewGame = 0x00002000,
OpeningSeq = 0x00004000,
Unlocks = 0x00008000,
PlayTime = 0x00010000,
NewAdventurer = 0x00020000,
SearchInfo = 0x00040000,
GC = 0x00080000,
CFPenaltyTime = 0x00100000,
All = 0xFFFFFFFF,
};
/**
* Structural representation of the packet sent by the server
* Send the entire StatusEffect list

View file

@ -29,10 +29,7 @@ uint64_t Core::Util::getTimeSeconds()
uint64_t Core::Util::getEorzeanTimeStamp()
{
std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
auto now = std::chrono::time_point_cast< std::chrono::seconds >( t1 ).time_since_epoch().count();
return static_cast< uint64_t >( now * 20.571428571428573f );
return static_cast< uint64_t >( getTimeSeconds() * 20.571428571428573f );
}
void Core::Util::valueToFlagByteIndexValue( uint32_t inVal, uint8_t& outVal, uint16_t& outIndex )

View file

@ -379,9 +379,6 @@ void Core::Entity::Player::setZone( uint32_t zoneId )
m_pCurrentZone = pZone;
m_pCurrentZone->pushActor( shared_from_this() );
// mark the player for a position update in DB
setSyncFlag( PlayerSyncFlags::Position );
GamePacketNew< FFXIVIpcInit, ServerZoneIpcType > initPacket( getId() );
initPacket.data().charId = getId();
queuePacket( initPacket );
@ -501,9 +498,6 @@ void Core::Entity::Player::registerAetheryte( uint8_t aetheryteId )
Util::valueToFlagByteIndexValue( aetheryteId, value, index );
m_aetheryte[index] |= value;
setSyncFlag( Aetherytes );
queuePacket( ActorControlPacket143( getId(), LearnTeleport, aetheryteId, 1 ) );
}
@ -544,8 +538,6 @@ void Core::Entity::Player::discover( int16_t map_id, int16_t sub_id )
m_discovery[index] |= value;
setSyncFlag( PlayerSyncFlags::Discovery );
uint16_t level = getLevel();
uint32_t exp = ( g_exdData.m_paramGrowthInfoMap[level].needed_exp * 5 / 100 );
@ -573,13 +565,11 @@ void Core::Entity::Player::setNewAdventurer( bool state )
//}
sendStateFlags();
m_bNewAdventurer = state;
setSyncFlag( PlayerSyncFlags::NewAdventurer );
}
void Core::Entity::Player::resetDiscovery()
{
memset( m_discovery, 0, sizeof( m_discovery ) );
setSyncFlag( PlayerSyncFlags::Discovery );
}
void Core::Entity::Player::changePosition( float x, float y, float z, float o )
@ -599,7 +589,6 @@ void Core::Entity::Player::learnAction( uint8_t actionId )
m_unlocks[index] |= value;
setSyncFlag( Unlocks );
queuePacket( ActorControlPacket143( getId(), ToggleActionUnlock, actionId, 1 ) );
}
@ -648,7 +637,6 @@ void Core::Entity::Player::gainExp( uint32_t amount )
}
sendStatusUpdate();
setSyncFlag( PlayerSyncFlags::ExpLevel );
}
void Core::Entity::Player::gainLevel()
@ -774,7 +762,6 @@ void Core::Entity::Player::setClassJob( Core::Common::ClassJob classJob )
sendToInRangeSet( ActorControlPacket142( getId(), ClassJobChange, 0x04 ), true );
setSyncFlag( Status );
sendStatusUpdate( true );
}
@ -782,16 +769,12 @@ void Core::Entity::Player::setLevel( uint8_t level )
{
uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( getClass() )].exp_idx;
m_classArray[classJobIndex] = level;
setSyncFlag( PlayerSyncFlags::ExpLevel );
}
void Core::Entity::Player::setLevelForClass( uint8_t level, Core::Common::ClassJob classjob )
{
uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( classjob )].exp_idx;
m_classArray[classJobIndex] = level;
setSyncFlag( PlayerSyncFlags::ExpLevel );
}
void Core::Entity::Player::sendModel()
@ -808,7 +791,6 @@ uint32_t Core::Entity::Player::getModelForSlot( Inventory::EquipSlot slot )
void Core::Entity::Player::setModelForSlot( Inventory::EquipSlot slot, uint32_t val )
{
m_modelEquip[slot] = val;
setSyncFlag( PlayerSyncFlags::Status );
}
uint64_t Core::Entity::Player::getModelMainWeapon() const
@ -856,7 +838,6 @@ uint8_t Core::Entity::Player::getLookAt( uint8_t index ) const
void Core::Entity::Player::setLookAt( uint8_t index, uint8_t value )
{
m_customize[index] = value;
setSyncFlag( PlayerSyncFlags::Look );
}
// spawn this player for pTarget
@ -920,8 +901,6 @@ void Core::Entity::Player::setGc( uint8_t gc )
gcAffPacket.data().gcRank[1] = m_gcRank[1];
gcAffPacket.data().gcRank[2] = m_gcRank[2];
queuePacket( gcAffPacket );
setSyncFlag( PlayerSyncFlags::GC );
}
void Core::Entity::Player::setGcRankAt( uint8_t index, uint8_t rank )
@ -934,8 +913,6 @@ void Core::Entity::Player::setGcRankAt( uint8_t index, uint8_t rank )
gcAffPacket.data().gcRank[1] = m_gcRank[1];
gcAffPacket.data().gcRank[2] = m_gcRank[2];
queuePacket( gcAffPacket );
setSyncFlag( PlayerSyncFlags::GC );
}
const uint8_t* Core::Entity::Player::getStateFlags() const
@ -1039,10 +1016,7 @@ void Core::Entity::Player::update( int64_t currTime )
}
if( m_hp <= 0 && m_status != ActorStatus::Dead )
{
die();
setSyncFlag( PlayerSyncFlags::Status );
}
if( !isAlive() )
return;
@ -1093,14 +1067,9 @@ void Core::Entity::Player::update( int64_t currTime )
{
// add 3 seconds to total play time
m_playTime += 3;
setSyncFlag( PlayerSyncFlags::PlayTime );
m_lastTickTime = currTime;
onTick();
}
createUpdateSql();
}
void Core::Entity::Player::onMobKill( uint16_t nameId )
@ -1121,11 +1090,6 @@ void Core::Entity::Player::freePlayerSpawnId( uint32_t actorId )
}
void Core::Entity::Player::setSyncFlag( uint32_t updateFlag )
{
m_updateFlags |= updateFlag;
}
uint8_t * Core::Entity::Player::getAetheryteArray()
{
return m_aetheryte;
@ -1137,8 +1101,6 @@ void Core::Entity::Player::setHomepoint( uint8_t aetheryteId )
m_homePoint = aetheryteId;
queuePacket( ActorControlPacket143( getId(), SetHomepoint, aetheryteId ) );
setSyncFlag( HomePoint );
}
/*! get homepoint */
@ -1254,9 +1216,6 @@ void Core::Entity::Player::performZoning(uint16_t zoneId, const Common::FFXIVARR
m_zoneId = zoneId;
m_bMarkedForZoning = true;
setRotation( rotation );
// mark the player for a position update in DB
setSyncFlag( PlayerSyncFlags::Position );
setZone( zoneId );
}
@ -1281,8 +1240,6 @@ void Core::Entity::Player::setSearchInfo( uint8_t selectRegion, uint8_t selectCl
m_searchSelectClass = selectClass;
memset( &m_searchMessage[0], 0, sizeof( searchMessage ) );
strcpy( &m_searchMessage[0], searchMessage );
setSyncFlag( PlayerSyncFlags::SearchInfo );
}
const char* Core::Entity::Player::getSearchMessage() const
@ -1323,8 +1280,6 @@ void Core::Entity::Player::updateHowtosSeen( uint32_t howToId )
uint8_t value = 1 << bitIndex;
m_howTo[index] |= value;
setSyncFlag( PlayerSyncFlags::HowTo );
}
@ -1486,7 +1441,6 @@ uint32_t Core::Entity::Player::getCFPenaltyTimestamp() const
void Core::Entity::Player::setCFPenaltyTimestamp( uint32_t timestamp )
{
m_cfPenaltyUntil = timestamp;
setSyncFlag( PlayerSyncFlags::CFPenaltyTime );
}
uint32_t Core::Entity::Player::getCFPenaltyMinutes() const
@ -1515,7 +1469,6 @@ uint8_t Core::Entity::Player::getOpeningSequence() const
void Core::Entity::Player::setOpeningSequence( uint8_t seq )
{
setSyncFlag( OpeningSeq );
m_openingSequence = seq;
}

View file

@ -409,9 +409,7 @@ public:
// Player Database Handling
//////////////////////////////////////////////////////////////////////////////////////////////////////
/*! generate the update sql based on update flags */
void createUpdateSql();
/*! set an update flag */
void setSyncFlag( uint32_t updateFlag );
void updateSql();
/*! load player from db, by id */
bool load( uint32_t charId, SessionPtr pSession );
/*! load active class data */
@ -606,7 +604,6 @@ private:
Common::ZoneingType m_zoningType;
bool m_bMarkedForZoning;
uint32_t m_updateFlags;
bool m_bNewAdventurer;
uint64_t m_onlineStatus;
boost::shared_ptr< QueuedZoning > m_queuedZoneing;

View file

@ -356,8 +356,5 @@ void Core::Entity::Player::onTick()
}
if( sendUpdate )
{
sendStatusUpdate();
setSyncFlag( PlayerSyncFlags::Status );
}
}

View file

@ -91,8 +91,6 @@ void Core::Entity::Player::finishQuest( uint16_t questId )
queuePacket( questFinishPacket );
updateQuestsCompleted( questId );
setSyncFlag( PlayerSyncFlags::Quests );
setSyncFlag( PlayerSyncFlags::QuestTracker );
for( int32_t ii = 0; ii < 5; ii++ )
{
@ -116,7 +114,6 @@ void Core::Entity::Player::finishQuest( uint16_t questId )
void Core::Entity::Player::unfinishQuest( uint16_t questId )
{
removeQuestsCompleted( questId );
setSyncFlag( PlayerSyncFlags::Quests );
sendQuestInfo();
}
@ -140,9 +137,6 @@ void Core::Entity::Player::removeQuest( uint16_t questId )
questFinishPacket.data().flag2 = 1;
queuePacket( questFinishPacket );
setSyncFlag( PlayerSyncFlags::Quests );
setSyncFlag( PlayerSyncFlags::QuestTracker );
for( int32_t ii = 0; ii < 5; ii++ )
{
if( m_questTracking[ii] == idx )
@ -550,7 +544,6 @@ void Core::Entity::Player::setQuestUI8A( uint16_t questId, uint8_t val )
pNewQuest->c.UI8A = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -565,7 +558,6 @@ void Core::Entity::Player::setQuestUI8B( uint16_t questId, uint8_t val )
pNewQuest->c.UI8B = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -580,7 +572,6 @@ void Core::Entity::Player::setQuestUI8C( uint16_t questId, uint8_t val )
pNewQuest->c.UI8C = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -595,7 +586,6 @@ void Core::Entity::Player::setQuestUI8D( uint16_t questId, uint8_t val )
pNewQuest->c.UI8D = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -610,7 +600,6 @@ void Core::Entity::Player::setQuestUI8E( uint16_t questId, uint8_t val )
pNewQuest->c.UI8E = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -625,7 +614,6 @@ void Core::Entity::Player::setQuestUI8F( uint16_t questId, uint8_t val )
pNewQuest->c.UI8F = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -640,7 +628,6 @@ void Core::Entity::Player::setQuestUI8AH( uint16_t questId, uint8_t val )
pNewQuest->b.UI8AH = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -655,7 +642,6 @@ void Core::Entity::Player::setQuestUI8BH( uint16_t questId, uint8_t val )
pNewQuest->b.UI8BH = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -670,7 +656,6 @@ void Core::Entity::Player::setQuestUI8CH( uint16_t questId, uint8_t val )
pNewQuest->b.UI8CH = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -685,7 +670,6 @@ void Core::Entity::Player::setQuestUI8DH( uint16_t questId, uint8_t val )
pNewQuest->b.UI8DH = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -700,7 +684,6 @@ void Core::Entity::Player::setQuestUI8EH( uint16_t questId, uint8_t val )
pNewQuest->b.UI8EH = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -715,7 +698,6 @@ void Core::Entity::Player::setQuestUI8FH( uint16_t questId, uint8_t val )
pNewQuest->b.UI8FH = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -730,7 +712,6 @@ void Core::Entity::Player::setQuestUI8AL( uint16_t questId, uint8_t val )
pNewQuest->b.UI8AL = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -745,7 +726,6 @@ void Core::Entity::Player::setQuestUI8BL( uint16_t questId, uint8_t val )
pNewQuest->b.UI8BL = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -760,7 +740,6 @@ void Core::Entity::Player::setQuestUI8CL( uint16_t questId, uint8_t val )
pNewQuest->b.UI8CL = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -775,7 +754,6 @@ void Core::Entity::Player::setQuestUI8DL( uint16_t questId, uint8_t val )
pNewQuest->b.UI8DL = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -790,7 +768,6 @@ void Core::Entity::Player::setQuestUI8EL( uint16_t questId, uint8_t val )
pNewQuest->b.UI8EL = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -805,7 +782,6 @@ void Core::Entity::Player::setQuestUI8FL( uint16_t questId, uint8_t val )
pNewQuest->b.UI8FL = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -820,7 +796,6 @@ void Core::Entity::Player::setQuestUI16A( uint16_t questId, uint16_t val )
// pNewQuest->d.UI16A = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -836,7 +811,6 @@ void Core::Entity::Player::setQuestUI16B( uint16_t questId, uint16_t val )
// pNewQuest->d.UI16B = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -851,7 +825,6 @@ void Core::Entity::Player::setQuestUI16C( uint16_t questId, uint16_t val )
// pNewQuest->d.UI16C = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -866,7 +839,6 @@ void Core::Entity::Player::setQuestUI32A( uint16_t questId, uint32_t val )
// pNewQuest->e.UI32A = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -881,7 +853,6 @@ void Core::Entity::Player::setQuestBitFlag8( uint16_t questId, uint8_t val )
pNewQuest->a.BitFlag8 = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -896,7 +867,6 @@ void Core::Entity::Player::setQuestBitFlag16( uint16_t questId, uint8_t val )
pNewQuest->a.BitFlag16 = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -911,7 +881,6 @@ void Core::Entity::Player::setQuestBitFlag24( uint16_t questId, uint8_t val )
pNewQuest->a.BitFlag24 = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
void Core::Entity::Player::setQuestBitFlag32( uint16_t questId, uint8_t val )
@ -925,7 +894,6 @@ void Core::Entity::Player::setQuestBitFlag32( uint16_t questId, uint8_t val )
pNewQuest->a.BitFlag32 = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -940,7 +908,6 @@ void Core::Entity::Player::setQuestBitFlag40( uint16_t questId, uint8_t val )
pNewQuest->a.BitFlag40 = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -955,7 +922,6 @@ void Core::Entity::Player::setQuestBitFlag48( uint16_t questId, uint8_t val )
pNewQuest->a.BitFlag48 = val;
updateQuest( questId, pNewQuest->c.sequence );
setSyncFlag( PlayerSyncFlags::Quests );
}
}
@ -985,8 +951,6 @@ void Core::Entity::Player::updateQuest( uint16_t questId, uint8_t sequence )
pe_qa.data().questInfo = *pNewQuest;
queuePacket( pe_qa );
setSyncFlag( PlayerSyncFlags::Quests );
}
else
{
@ -1012,9 +976,6 @@ void Core::Entity::Player::updateQuest( uint16_t questId, uint8_t sequence )
queuePacket( pe_qa );
setSyncFlag( PlayerSyncFlags::Quests );
setSyncFlag( PlayerSyncFlags::QuestTracker );
for( int32_t ii = 0; ii < 5; ii++ )
{
if( m_questTracking[ii] == -1 )
@ -1071,8 +1032,6 @@ void Core::Entity::Player::setQuestTracker( uint16_t index, int16_t flag )
}
}
setSyncFlag( PlayerSyncFlags::QuestTracker );
}
@ -1115,8 +1074,6 @@ void Core::Entity::Player::updateQuestsCompleted( uint32_t questId )
uint8_t value = 0x80 >> bitIndex;
m_questCompleteFlags[index] |= value;
setSyncFlag( PlayerSyncFlags::Quests );
}
void Core::Entity::Player::removeQuestsCompleted( uint32_t questId )
@ -1128,7 +1085,6 @@ void Core::Entity::Player::removeQuestsCompleted( uint32_t questId )
m_questCompleteFlags[index] ^= value;
setSyncFlag( PlayerSyncFlags::Quests );
}
bool Core::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t optionalChoice )

View file

@ -93,7 +93,6 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession )
return false;
}
m_updateFlags = PlayerSyncFlags::None;
m_id = charId;
Db::Field *field = pQR->fetch();
@ -197,7 +196,6 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession )
m_bNewGame = false;
m_hp = getMaxHp();
m_mp = getMaxMp();
setSyncFlag( PlayerSyncFlags::NewGame );
}
if( m_hp > getMaxHp() )
@ -265,12 +263,10 @@ bool Core::Entity::Player::loadSearchInfo()
}
void Core::Entity::Player::createUpdateSql()
void Core::Entity::Player::updateSql()
{
// if nothing to update, don't bother.
if( m_updateFlags == PlayerSyncFlags::None )
return;
g_log.info( "Updating Player Data to SQL DB " );
std::set< std::string > charaBaseSet;
std::set< std::string > charaDetailSet;
@ -287,117 +283,70 @@ void Core::Entity::Player::createUpdateSql()
std::string condition = " UPDATE_DATE = NOW() WHERE CharacterId = " + std::to_string( m_id ) + ";";
if( m_updateFlags & PlayerSyncFlags::Position )
charaBaseSet.insert( " Pos_0_0 = " + std::to_string( m_pos.x ) );
charaBaseSet.insert( " Pos_0_1 = " + std::to_string( m_pos.y ) );
charaBaseSet.insert( " Pos_0_2 = " + std::to_string( m_pos.z ) );
charaBaseSet.insert( " Pos_0_3 = " + std::to_string( getRotation() ) );
charaBaseSet.insert( " PrimaryTerritoryId = " + std::to_string( m_zoneId ) );
charaBaseSet.insert( " IsNewGame = " + std::to_string( static_cast< uint32_t >( m_bNewGame ) ) );
charaBaseSet.insert( " IsNewAdventurer = " + std::to_string( static_cast< uint32_t >( m_bNewAdventurer ) ) );
charaBaseSet.insert( " Hp = " + std::to_string( getHp() ) );
charaBaseSet.insert( " Mp = " + std::to_string( getMp() ) );
charaBaseSet.insert( " Mode = " + std::to_string( static_cast< uint32_t >( getStance() ) ) );
charaBaseSet.insert( " ModelEquip = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_modelEquip ), 40 ) ) + "')" );
charaDetailSet.insert( " Homepoint = " + std::to_string( m_homePoint ) );
charaDetailSet.insert( " Discovery = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_discovery ), sizeof( m_discovery ) ) ) + "')" );
charaDetailSet.insert( " TotalPlayTime = " + std::to_string( m_playTime ) );
charaDetailSet.insert( " unlocks = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_unlocks ), sizeof( m_unlocks ) ) ) + "')" );
charaDetailSet.insert( " QuestTracking = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_questTracking ), sizeof( m_questTracking ) ) ) + "')" );
charaDetailSet.insert( " HowTo = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_howTo ), sizeof( m_howTo ) ) ) + "')" );
charaDetailSet.insert( " Aetheryte = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_aetheryte ), sizeof( m_aetheryte ) ) ) + "')" );
charaDetailSet.insert( " GrandCompany = " + std::to_string( m_gc ) );
charaDetailSet.insert( " GrandCompanyRank = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_gcRank ), sizeof( m_gcRank ) ) ) + "')" );
charaDetailSet.insert( " CFPenaltyUntil = " + std::to_string( m_cfPenaltyUntil ) );
charaDetailSet.insert( " Class = " + std::to_string( static_cast< uint32_t >( getClass() ) ) );
charaDetailSet.insert( " Status = " + std::to_string( static_cast< uint8_t >( getStatus() ) ) );
charaDetailSet.insert( " OpeningSequence = " + std::to_string( static_cast< uint8_t >( getOpeningSequence() ) ) );
charaDetailSet.insert( " QuestCompleteFlags = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_questCompleteFlags ), 200 ) ) + "')" );
uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( getClass() )].exp_idx;
charaClassSet.insert( " Lv_" + std::to_string( classJobIndex ) + " = " + std::to_string( static_cast< uint32_t >( getLevel() ) ) );
charaClassSet.insert( " Exp_" + std::to_string( classJobIndex ) + " = " + std::to_string( getExp() ) );
for( int32_t i = 0; i < 30; i++ )
{
charaBaseSet.insert( " Pos_0_0 = " + std::to_string( m_pos.x ) );
charaBaseSet.insert( " Pos_0_1 = " + std::to_string( m_pos.y ) );
charaBaseSet.insert( " Pos_0_2 = " + std::to_string( m_pos.z ) );
charaBaseSet.insert( " Pos_0_3 = " + std::to_string( getRotation() ) );
charaBaseSet.insert( " PrimaryTerritoryId = " + std::to_string( m_zoneId ) );
}
if( m_updateFlags & PlayerSyncFlags::HomePoint )
charaDetailSet.insert( " Homepoint = " + std::to_string( m_homePoint ) );
if( m_updateFlags & PlayerSyncFlags::Discovery )
charaDetailSet.insert( " Discovery = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_discovery ), sizeof( m_discovery ) ) ) + "')" );
if( m_updateFlags & PlayerSyncFlags::PlayTime )
charaDetailSet.insert( " TotalPlayTime = " + std::to_string( m_playTime ) );
if( m_updateFlags & PlayerSyncFlags::Unlocks )
charaDetailSet.insert( " unlocks = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_unlocks ), sizeof( m_unlocks ) ) ) + "')" );
if( m_updateFlags & PlayerSyncFlags::QuestTracker )
charaDetailSet.insert( " QuestTracking = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_questTracking ), sizeof( m_questTracking ) ) ) + "')" );
if( m_updateFlags & PlayerSyncFlags::HowTo )
charaDetailSet.insert( " HowTo = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_howTo ), sizeof( m_howTo ) ) ) + "')" );
if( m_updateFlags & PlayerSyncFlags::Aetherytes )
charaDetailSet.insert( " Aetheryte = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_aetheryte ), sizeof( m_aetheryte ) ) ) + "')" );
if( m_updateFlags & PlayerSyncFlags::NewGame )
charaBaseSet.insert( " IsNewGame = " + std::to_string( static_cast< uint32_t >( m_bNewGame ) ) );
if( m_updateFlags & PlayerSyncFlags::NewAdventurer )
charaBaseSet.insert( " IsNewAdventurer = " + std::to_string( static_cast< uint32_t >( m_bNewAdventurer ) ) );
if( m_updateFlags & PlayerSyncFlags::GC )
{
charaDetailSet.insert( " GrandCompany = " + std::to_string( m_gc ) );
charaDetailSet.insert( " GrandCompanyRank = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_gcRank ), sizeof( m_gcRank ) ) ) + "')" );
}
if( m_updateFlags & PlayerSyncFlags::CFPenaltyTime )
{
charaDetailSet.insert( " CFPenaltyUntil = " + std::to_string( m_cfPenaltyUntil ) );
}
if( m_updateFlags & PlayerSyncFlags::ExpLevel )
{
uint8_t classJobIndex = g_exdData.m_classJobInfoMap[static_cast< uint8_t >( getClass() )].exp_idx;
charaClassSet.insert( " Lv_" + std::to_string( classJobIndex ) + " = " + std::to_string( static_cast< uint32_t >( getLevel() ) ) );
charaClassSet.insert( " Exp_" + std::to_string( classJobIndex ) + " = " + std::to_string( getExp() ) );
}
if( m_updateFlags & PlayerSyncFlags::Status )
{
charaBaseSet.insert( " Hp = " + std::to_string( getHp() ) );
charaBaseSet.insert( " Mp = " + std::to_string( getMp() ) );
charaBaseSet.insert( " Mode = " + std::to_string( static_cast< uint32_t >( getStance() ) ) );
charaBaseSet.insert( " ModelEquip = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_modelEquip ), 40 ) ) + "')" );
charaDetailSet.insert( " Class = " + std::to_string( static_cast< uint32_t >( getClass() ) ) );
charaDetailSet.insert( " Status = " + std::to_string( static_cast< uint8_t >( getStatus() ) ) );
}
if( m_updateFlags & PlayerSyncFlags::OpeningSeq )
{
charaDetailSet.insert( " OpeningSequence = " + std::to_string( static_cast< uint8_t >( getOpeningSequence() ) ) );
}
if( m_updateFlags & PlayerSyncFlags::Quests )
{
charaDetailSet.insert( " QuestCompleteFlags = UNHEX('" + std::string( Util::binaryToHexString( static_cast< uint8_t* >( m_questCompleteFlags ), 200 ) ) + "')" );
for( int32_t i = 0; i < 30; i++ )
if( m_activeQuests[i] != nullptr )
{
if( m_activeQuests[i] != nullptr )
{
charaQuestSet.insert( " QuestId_" + std::to_string( i ) + " = " + std::to_string( m_activeQuests[i]->c.questId ) );
charaQuestSet.insert( " Sequence_" + std::to_string( i ) + " = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.sequence ) ) );
charaQuestSet.insert( " Flags_" + std::to_string( i ) + " = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.flags ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_0 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8A ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_1 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8B ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_2 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8C ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_3 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8D ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_4 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8E ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_5 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8F ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_6 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.padding1 ) ) );
}
else
{
charaQuestSet.insert( " QuestId_" + std::to_string( i ) + " = 0" );
charaQuestSet.insert( " Sequence_" + std::to_string( i ) + " = 0" );
charaQuestSet.insert( " Flags_" + std::to_string( i ) + " = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_0 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_1 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_2 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_3 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_4 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_5 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_6 = 0" );
}
charaQuestSet.insert( " QuestId_" + std::to_string( i ) + " = " + std::to_string( m_activeQuests[i]->c.questId ) );
charaQuestSet.insert( " Sequence_" + std::to_string( i ) + " = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.sequence ) ) );
charaQuestSet.insert( " Flags_" + std::to_string( i ) + " = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.flags ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_0 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8A ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_1 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8B ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_2 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8C ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_3 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8D ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_4 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8E ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_5 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.UI8F ) ) );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_6 = " + std::to_string( static_cast< uint32_t >( m_activeQuests[i]->c.padding1 ) ) );
}
else
{
charaQuestSet.insert( " QuestId_" + std::to_string( i ) + " = 0" );
charaQuestSet.insert( " Sequence_" + std::to_string( i ) + " = 0" );
charaQuestSet.insert( " Flags_" + std::to_string( i ) + " = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_0 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_1 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_2 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_3 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_4 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_5 = 0" );
charaQuestSet.insert( " Variables_" + std::to_string( i ) + "_6 = 0" );
}
}
if( m_updateFlags & PlayerSyncFlags::SearchInfo )
{
charaInfoSearchSet.insert( " SelectClassId = " + std::to_string( m_searchSelectClass ) );
charaInfoSearchSet.insert( " SelectRegion = " + std::to_string( m_searchSelectRegion ) );
charaInfoSearchSet.insert( " SearchComment = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_searchMessage ), sizeof( m_searchMessage ) ) + "')" ) );
}
charaInfoSearchSet.insert( " SelectClassId = " + std::to_string( m_searchSelectClass ) );
charaInfoSearchSet.insert( " SelectRegion = " + std::to_string( m_searchSelectRegion ) );
charaInfoSearchSet.insert( " SearchComment = UNHEX('" + std::string( Util::binaryToHexString( reinterpret_cast< uint8_t* >( m_searchMessage ), sizeof( m_searchMessage ) ) + "')" ) );
if( !charaInfoSearchSet.empty() )
{
@ -444,7 +393,5 @@ void Core::Entity::Player::createUpdateSql()
g_database.execute( updateCharaQuest );
}
m_updateFlags = PlayerSyncFlags::None;
}

View file

@ -166,7 +166,7 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
pPlayer->resetHp();
pPlayer->resetMp();
pPlayer->setStatus( Entity::Actor::ActorStatus::Idle );
pPlayer->setSyncFlag( Status );
pPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x01, 0, 111 ), true );
pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatus, static_cast< uint8_t >( Entity::Actor::ActorStatus::Idle ) ), true );
}

View file

@ -370,9 +370,6 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac
break;
}
pPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
targetPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
}
void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer )
@ -416,7 +413,6 @@ void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPac
targetPlayer->resetHp();
targetPlayer->resetMp();
targetPlayer->setStatus( Entity::Actor::ActorStatus::Idle );
targetPlayer->setSyncFlag( Status );
targetPlayer->sendToInRangeSet( ActorControlPacket143( pPlayer->getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true );
targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatus,
@ -464,7 +460,4 @@ void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPac
break;
}
pPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
targetPlayer->setSyncFlag( Common::PlayerSyncFlags::All );
}

View file

@ -95,8 +95,5 @@ void Core::Network::GameConnection::inventoryModifyHandler( const Packets::GameP
break;
}
pPlayer->setSyncFlag( PlayerSyncFlags::Status );
}

View file

@ -190,8 +190,6 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa
inPacket.getValAt< float >( 0x30 ),
inPacket.getValAt< float >( 0x34 ) );
pPlayer->setSyncFlag( PlayerSyncFlags::Position );
if( ( pPlayer->getCurrentAction() != nullptr ) && bPosChanged )
pPlayer->getCurrentAction()->setInterrupted();
@ -327,8 +325,6 @@ void Core::Network::GameConnection::zoneLineHandler( const Packets::GamePacket&
}
pPlayer->performZoning( targetZone, targetPos, rotation);
pPlayer->setSyncFlag( PlayerSyncFlags::Position );
}

View file

@ -333,7 +333,6 @@ void Core::ServerZone::run( int32_t argc, char* argv[] )
g_log.setLogPath( "log\\SapphireZone_" );
g_log.init();
printBanner();
if( !loadSettings( argc, argv ) )

View file

@ -9,7 +9,8 @@
Core::Session::Session( uint32_t sessionId )
: m_sessionId( sessionId )
, m_lastDataTime( static_cast< uint32_t >( time( nullptr ) ) )
, m_lastDataTime( static_cast< uint32_t >( Util::getTimeSeconds() ) )
, m_lastSqlTime( static_cast< uint32_t >( Util::getTimeSeconds() ) )
{
// boost::posix_time::ptime now = boost::date_time::not_a_date_time;
@ -49,10 +50,7 @@ bool Core::Session::loadPlayer()
m_pPlayer = Entity::PlayerPtr( new Entity::Player() );
if( !m_pPlayer->load( m_sessionId, shared_from_this() ) )
return false;
return true;
return m_pPlayer->load(m_sessionId, shared_from_this() );
}
@ -77,9 +75,19 @@ uint32_t Core::Session::getLastDataTime() const
return m_lastDataTime;
}
uint32_t Core::Session::getLastSqlTime() const
{
return m_lastSqlTime;
}
void Core::Session::updateLastDataTime()
{
m_lastDataTime = static_cast< uint32_t >( time( nullptr ) );
m_lastDataTime = static_cast< uint32_t >( Util::getTimeSeconds() );
}
void Core::Session::updateLastSqlTime()
{
m_lastSqlTime = static_cast< uint32_t >( Util::getTimeSeconds() );
}
void Core::Session::update()
@ -91,7 +99,11 @@ void Core::Session::update()
// SESSION LOGIC
m_pPlayer->update( Util::getTimeMs() );
m_pPlayer->createUpdateSql();
if( ( static_cast< uint32_t >( Util::getTimeSeconds() ) - static_cast< uint32_t >( getLastSqlTime() ) ) > 10 )
{
updateLastSqlTime();
m_pPlayer->updateSql();
}
m_pZoneConnection->processOutQueue();
}

View file

@ -24,8 +24,10 @@ namespace Core {
Network::GameConnectionPtr getChatConnection() const;
uint32_t getLastDataTime() const;
uint32_t getLastSqlTime() const;
void updateLastDataTime();
void updateLastSqlTime();
void close();
@ -44,6 +46,8 @@ namespace Core {
uint32_t m_lastDataTime;
uint32_t m_lastSqlTime;
Network::GameConnectionPtr m_pZoneConnection;
Network::GameConnectionPtr m_pChatConnection;