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

Improved Persistence (#822)

* persistant money

* removed hardcoding and fixed debug console spam

* refactor: fix coding system inconsistencies

* refactor: fix coding style inconsistencies in loading

* refactor: Missed some inconsistents

* refactor: Missed some more inconsistents

* quest: Introduced marauder quest (can get class, but no cutscenes yet)

* refactor: Code updated to fmt::format

* Delete ClsMar999.cpp

* Delete ClsMar998.cpp

* script-loader fix

* script-loader formatting

* build-error: removed broken dep
This commit is contained in:
Matthew 2023-01-06 22:18:29 -05:00 committed by GitHub
parent 68a249792c
commit f71230809b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 52 additions and 5 deletions

1
deps/ffxiv-actions vendored Submodule

@ -0,0 +1 @@
Subproject commit dde9b5bbfc7c0197de0b0b49b982a0ee9fe761ab

View file

@ -322,11 +322,13 @@ void Player::calculateStats()
uint8_t tribe = getLookAt( Common::CharaLook::Tribe );
uint8_t level = getLevel();
auto job = static_cast< uint8_t >( getClass() );
auto deity = getGuardianDeity();
auto& exdData = Common::Service< Data::ExdData >::ref();
auto classInfo = exdData.getRow< Excel::ClassJob >( job );
auto tribeInfo = exdData.getRow< Excel::Tribe >( tribe );
auto deityInfo = exdData.getRow< Excel::GuardianDeity >( deity );
auto paramGrowthInfo = exdData.getRow< Excel::ParamGrow >( level );
float base = Math::CalcStats::calculateBaseStat( *this );
@ -374,6 +376,8 @@ void Player::calculateStats()
setStatValue( BaseParam::AttackMagicPotency, inte );
setStatValue( BaseParam::HealingMagicPotency, mnd );
setStatValue( BaseParam::PiercingResistance, 0 );
max_mp = Math::CalcStats::calculateMaxMp( *this );
max_hp = Math::CalcStats::calculateMaxHp( *this );

View file

@ -736,6 +736,8 @@ namespace Sapphire::Entity
void writeItem( ItemPtr pItem ) const;
void writeCurrencyItem( Common::CurrencyType type );
void deleteItemDb( ItemPtr pItem ) const;
/*! return the crystal amount of currency of type */

View file

@ -301,7 +301,7 @@ void Sapphire::Entity::Player::addCurrency( CurrencyType type, uint32_t amount )
uint32_t currentAmount = currItem->getStackSize();
currItem->setStackSize( currentAmount + amount );
writeItem( currItem );
writeCurrencyItem( type );
updateContainer( Currency, slot, currItem );
@ -339,7 +339,7 @@ void Sapphire::Entity::Player::removeCurrency( Common::CurrencyType type, uint32
currItem->setStackSize( 0 );
else
currItem->setStackSize( currentAmount - amount );
writeItem( currItem );
writeCurrencyItem( type );
auto seq = getNextInventorySequence();
@ -531,7 +531,7 @@ void Sapphire::Entity::Player::writeInventory( InventoryType type )
if( i > 0 )
query += ", ";
query += "container_" + std::to_string( i ) + " = " + std::to_string( currItem ? currItem->getUId() : 0 );
query += "container_" + std::to_string( i ) + " = " + std::to_string( currItem ? currItem->getUId() : 0 );
}
query += " WHERE CharacterId = " + std::to_string( getCharacterId() );
@ -557,6 +557,19 @@ void Sapphire::Entity::Player::writeItem( Sapphire::ItemPtr pItem ) const
db.directExecute( stmt );
}
void Sapphire::Entity::Player::writeCurrencyItem( CurrencyType type )
{
auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref();
auto money = m_storageMap[ Currency ]->getItem( static_cast< uint16_t >( type ) - 1 )->getStackSize();
std::string query = fmt::format(
"UPDATE charaitemcurrency SET container_{0} = {1} WHERE CharacterId = {2};",
std::to_string( static_cast< int16_t >( type ) - 1 ), std::to_string( money ), std::to_string( getCharacterId() ) );
db.execute( query );
}
void Sapphire::Entity::Player::deleteItemDb( Sapphire::ItemPtr item ) const
{
auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref();

View file

@ -152,7 +152,7 @@ bool Sapphire::Entity::Player::loadFromDb( uint64_t characterId )
// Stats
m_hp = res->getUInt( "Hp" );
m_mp = res->getUInt( "Mp" );
m_tp = 0;
m_tp = res->getUInt( "Tp" );
m_maxHp = getMaxHp();
m_maxMp = getMaxMp();
@ -168,6 +168,7 @@ bool Sapphire::Entity::Player::loadFromDb( uint64_t characterId )
m_bNewGame = false;
m_hp = getMaxHp();
m_mp = getMaxMp();
m_tp = 1000;
}
if( m_hp == 0 )
@ -323,7 +324,7 @@ void Sapphire::Entity::Player::updateDbChara() const
stmt->setInt( 1, getHp() );
stmt->setInt( 2, getMp() );
stmt->setInt( 3, 0 ); // TP
stmt->setInt( 3, getTp() ); // TP
stmt->setInt( 4, 0 ); // GP
stmt->setInt( 5, 0 ); // Mode
stmt->setUInt( 6, m_mount ); // Mount
@ -696,6 +697,32 @@ bool Sapphire::Entity::Player::loadInventory()
}
}
auto currencyRes = db.query(fmt::format("SELECT storageId, "
"container_0, container_1, container_2, container_3, container_4, "
"container_5, container_6, container_7, container_8, container_9, "
"container_10, container_11 "
"FROM charaitemcurrency " \
"WHERE CharacterId = {0} " \
"ORDER BY storageId ASC;", std::to_string(m_characterId)));
while ( currencyRes->next() )
{
uint16_t storageId = currencyRes->getUInt16( 1 );
uint32_t money = currencyRes->getUInt64( 2 );
auto slot = static_cast< uint8_t >( static_cast< uint8_t >( CurrencyType::Gil ) - 1 );
auto currItem = m_storageMap[ Currency ]->getItem( slot );
if ( !currItem )
{
// TODO: map currency type to itemid
currItem = createItem( 1 );
m_storageMap[ Currency ]->setItem( slot, currItem );
}
m_storageMap[ Currency ]->getItem( slot )->setStackSize( money );
}
return true;
}