aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSnapperRy <snapperryen@gmail.com>2016-09-13 04:16:05 +0200
committerGitHub <noreply@github.com>2016-09-13 04:16:05 +0200
commit6f1e823cac8050780afb11f2befb3fb829200418 (patch)
treec3c7d992c2888da9f2d6778317b90410b2b4688e /src
parentb125a3fd2c969f70a73d9128cfd05dc223203079 (diff)
Core/Fishing: implement retail-like fishing skill-up functionality (#17528)
Diffstat (limited to 'src')
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp8
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp59
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Tools/PlayerDump.cpp3
5 files changed, 61 insertions, 13 deletions
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
index b217bff2875..658827662ec 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
@@ -63,12 +63,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, bankSlots, restState, playerFlags, "
+ PrepareStatement(CHAR_SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, 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, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
- "health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels "
- "FROM characters WHERE guid = ?", CONNECTION_ASYNC);
+ "health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels, 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 FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC);
@@ -547,6 +547,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, "DELETE FROM character_talent WHERE guid = ? AND spell = ? AND talentGroup = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, talentGroup) VALUES (?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", 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);
// Items that hold loot or money
PrepareStatement(CHAR_SEL_ITEMCONTAINER_ITEMS, "SELECT item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_prop, rnd_suffix FROM item_loot_items WHERE container_id = ?", CONNECTION_SYNCH);
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h
index d767fe8a70c..5fd276080e7 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.h
+++ b/src/server/database/Database/Implementation/CharacterDatabase.h
@@ -471,6 +471,8 @@ enum CharacterDatabaseStatements
CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC,
CHAR_INS_CHAR_TALENT,
CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC,
+ CHAR_INS_CHAR_FISHINGSTEPS,
+ CHAR_DEL_CHAR_FISHINGSTEPS,
CHAR_REP_CALENDAR_EVENT,
CHAR_DEL_CALENDAR_EVENT,
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index c709db8f267..7a07b9d980c 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -497,6 +497,7 @@ Player::Player(WorldSession* session): Unit(true)
m_lastFallZ = 0;
m_grantableLevels = 0;
+ m_fishingSteps = 0;
m_ControlledByPlayer = true;
@@ -4524,6 +4525,10 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
stmt->setUInt32(0, guid);
trans->Append(stmt);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_FISHINGSTEPS);
+ stmt->setUInt32(0, guid);
+ trans->Append(stmt);
+
Corpse::DeleteFromDB(playerguid, trans);
CharacterDatabase.CommitTransaction(trans);
@@ -5744,17 +5749,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;
}
// levels sync. with spell requirement for skill levels to learn
@@ -16886,8 +16913,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
//"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
// 44 45 46 47 48 49 50 51 52 53 54
//"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
- // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
- //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels FROM characters WHERE guid = '%u'", guid);
+ // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
+ //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels, fishing_steps FROM characters WHERE guid = '%u'", guid);
PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM);
if (!result)
{
@@ -17003,6 +17030,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[70].GetUInt8());
+ m_fishingSteps = fields[72].GetUInt8();
+
InitDisplayIds();
// cleanup inventory related item value fields (it will be filled correctly in _LoadInventory)
@@ -19027,9 +19056,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->setUInt32(0, GetGUID().GetCounter());
+ trans->Append(stmt);
+
if (create)
{
//! Insert query
@@ -19141,7 +19175,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
{
@@ -19273,10 +19307,17 @@ void Player::SaveToDB(bool create /*=false*/)
stmt->setUInt32(index++, GetGUID().GetCounter());
}
- SQLTransaction trans = CharacterDatabase.BeginTransaction();
-
trans->Append(stmt);
+ if (m_fishingSteps != 0)
+ {
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_FISHINGSTEPS);
+ index = 0;
+ stmt->setUInt32(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 d078321b55c..5a572d9caa9 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2524,6 +2524,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
uint8 m_grantableLevels;
+ uint8 m_fishingSteps;
+
bool m_needsZoneUpdate;
private:
diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp
index e009fe66b08..3f3a146c3cc 100644
--- a/src/server/game/Tools/PlayerDump.cpp
+++ b/src/server/game/Tools/PlayerDump.cpp
@@ -25,7 +25,7 @@
#include "AccountMgr.h"
#include "World.h"
-#define DUMP_TABLE_COUNT 31
+#define DUMP_TABLE_COUNT 32
struct DumpTable
{
char const* name;
@@ -42,6 +42,7 @@ DumpTable const dumpTables[DUMP_TABLE_COUNT] =
{ "character_aura", DTT_CHAR_TABLE },
{ "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 },