From cab4ce3a532b15f95144ef17ff2bf752c56495d6 Mon Sep 17 00:00:00 2001 From: SnapperRy Date: Tue, 13 Sep 2016 04:16:05 +0200 Subject: Core/Fishing: implement retail-like fishing skill-up functionality (#17528) Follow-up to 6f1e823. Forgot to update base characters database. Sorry. --- .../Database/Implementation/CharacterDatabase.cpp | 8 +-- .../Database/Implementation/CharacterDatabase.h | 2 + src/server/game/Entities/Player/Player.cpp | 59 ++++++++++++++++++---- src/server/game/Entities/Player/Player.h | 2 + src/server/game/Tools/PlayerDump.cpp | 3 +- 5 files changed, 61 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 6cb0072d462..7173e32d96a 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -78,12 +78,12 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER, "SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, " + PrepareStatement(CHAR_SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, " "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " - "health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty " - "FROM characters WHERE guid = ?", CONNECTION_ASYNC); + "health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty, fishingSteps " + "FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_BOTH); PrepareStatement(CHAR_SEL_CHARACTER_INSTANCE, "SELECT id, permanent, map, difficulty, extendState, resettime, entranceId FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC); @@ -612,6 +612,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs VALUES(?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, talentId, talentGroup) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_LIST_SLOT, "UPDATE characters SET slot = ? WHERE guid = ? AND account = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHAR_FISHINGSTEPS, "INSERT INTO character_fishingsteps (guid, fishingSteps) VALUES (?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CHAR_FISHINGSTEPS, "DELETE FROM character_fishingsteps WHERE guid = ?", CONNECTION_ASYNC); // Void Storage PrepareStatement(CHAR_SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomPropertyType, randomProperty, suffixFactor, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, bonusListIDs FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index b28c9322efa..97190f9f614 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -514,6 +514,8 @@ enum CharacterDatabaseStatements CHAR_INS_CHAR_GLYPHS, CHAR_INS_CHAR_TALENT, CHAR_UPD_CHAR_LIST_SLOT, + CHAR_INS_CHAR_FISHINGSTEPS, + CHAR_DEL_CHAR_FISHINGSTEPS, CHAR_SEL_CHAR_VOID_STORAGE, CHAR_REP_CHAR_VOID_STORAGE_ITEM, diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 421c4f85168..17710f694b9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -306,6 +306,7 @@ Player::Player(WorldSession* session) : Unit(true), m_sceneMgr(this) m_lastFallZ = 0; m_grantableLevels = 0; + m_fishingSteps = 0; m_ControlledByPlayer = true; @@ -4094,6 +4095,10 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_FISHINGSTEPS); + stmt->setUInt64(0, guid); + trans->Append(stmt); + Corpse::DeleteFromDB(playerguid, trans); Garrison::DeleteFromDB(guid, trans); @@ -5294,17 +5299,39 @@ bool Player::UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLeve return false; } +uint8 GetFishingStepsNeededToLevelUp(uint32 SkillValue) +{ + // These formulas are guessed to be as close as possible to how the skill difficulty curve for fishing was on Retail. + if (SkillValue < 75) + return 1; + + if (SkillValue <= 300) + return SkillValue / 44; + + return SkillValue / 31; +} + bool Player::UpdateFishingSkill() { TC_LOG_DEBUG("entities.player.skills", "Player::UpdateFishingSkill: Player '%s' (%s)", GetName().c_str(), GetGUID().ToString().c_str()); uint32 SkillValue = GetPureSkillValue(SKILL_FISHING); - int32 chance = SkillValue < 75 ? 100 : 2500/(SkillValue-50); + if (SkillValue >= GetMaxSkillValue(SKILL_FISHING)) + return false; - uint32 gathering_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING); + uint8 stepsNeededToLevelUp = GetFishingStepsNeededToLevelUp(SkillValue); + ++m_fishingSteps; + + if (m_fishingSteps >= stepsNeededToLevelUp) + { + m_fishingSteps = 0; - return UpdateSkillPro(SKILL_FISHING, chance*10, gathering_skill_gain); + uint32 gathering_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING); + return UpdateSkillPro(SKILL_FISHING, 100*10, gathering_skill_gain); + } + + return false; } bool Player::UpdateSkillPro(uint16 skillId, int32 chance, uint32 step) @@ -17140,8 +17167,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) //"resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " // 48 49 50 51 52 53 //"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " - // 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 - //"health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty " + // 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 + //"health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty, fishing_steps " // //"FROM characters WHERE guid = ?", CONNECTION_ASYNC); PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM); @@ -17261,6 +17288,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) SetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES, fields[66].GetUInt8()); + m_fishingSteps = fields[70].GetUInt8(); + InitDisplayIds(); // cleanup inventory related item value fields (it will be filled correctly in _LoadInventory) @@ -19471,9 +19500,14 @@ void Player::SaveToDB(bool create /*=false*/) if (!create) sScriptMgr->OnPlayerSave(this); - PreparedStatement* stmt; + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + PreparedStatement* stmt = nullptr; uint8 index = 0; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_FISHINGSTEPS); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + if (create) { //! Insert query @@ -19599,7 +19633,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setString(index++, ss.str()); stmt->setUInt8(index++, GetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES)); - stmt->setUInt32(index, m_grantableLevels); + stmt->setUInt32(index++, m_grantableLevels); } else { @@ -19747,10 +19781,17 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt64(index, GetGUID().GetCounter()); } - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - trans->Append(stmt); + if (m_fishingSteps != 0) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_FISHINGSTEPS); + index = 0; + stmt->setUInt64(index++, GetGUID().GetCounter()); + stmt->setUInt32(index++, m_fishingSteps); + trans->Append(stmt); + } + if (m_mailsUpdated) //save mails only when needed _SaveMail(trans); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 21aa89bf12b..654fe3bdce8 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2783,6 +2783,8 @@ class TC_GAME_API Player : public Unit, public GridObject uint8 m_grantableLevels; + uint8 m_fishingSteps; + std::array, MAX_CUF_PROFILES> _CUFProfiles; private: diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 28f640cd4ce..b072760dc0f 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -24,7 +24,7 @@ #include "AccountMgr.h" #include "World.h" -#define DUMP_TABLE_COUNT 34 +#define DUMP_TABLE_COUNT 35 struct DumpTable { char const* name; @@ -44,6 +44,7 @@ DumpTable const dumpTables[DUMP_TABLE_COUNT] = { "character_currency", DTT_CURRENCY }, { "character_declinedname", DTT_CHAR_TABLE }, { "character_equipmentsets", DTT_EQSET_TABLE}, + { "character_fishingsteps", DTT_CHAR_TABLE }, { "character_glyphs", DTT_CHAR_TABLE }, { "character_homebind", DTT_CHAR_TABLE }, { "character_inventory", DTT_INVENTORY }, -- cgit v1.2.3