Core/Fishing: implement retail-like fishing skill-up functionality
This commit is contained in:
1 parent
e5bb91c364
commit
9182a19aa5
7 files changed
+91
-14
No files matched your search
@@ -751,6 +751,29 @@ LOCK TABLES `character_equipmentsets` WRITE;
|
||||
/*!40000 ALTER TABLE `character_equipmentsets` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `character_fishingsteps`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `character_fishingsteps`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `character_fishingsteps` (
|
||||
`guid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier',
|
||||
`fishingSteps` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`guid`)
|
||||
) ENGINE=INNODB DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `character_fishingsteps`
|
||||
--
|
||||
|
||||
LOCK TABLES `character_fishingsteps` WRITE;
|
||||
/*!40000 ALTER TABLE `character_fishingsteps` DISABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `character_fishingsteps` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `character_gifts`
|
||||
--
|
||||
@@ -2792,7 +2815,7 @@ CREATE TABLE `updates` (
|
||||
|
||||
LOCK TABLES `updates` WRITE;
|
||||
/*!40000 ALTER TABLE `updates` DISABLE KEYS */;
|
||||
INSERT INTO `updates` VALUES ('2014_10_28_00_characters.sql','DCC0367E2784919FBE6ED44D60057179','ARCHIVED','2014-10-28 21:00:00',0),('2015_03_20_00_characters.sql','B761760804EA73BD297F296C5C1919687DF7191C','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_01_characters.sql','894F08B70449A5481FFAF394EE5571D7FC4D8A3A','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_02_characters.sql','97D7BE0CAADC79F3F11B9FD296B8C6CD40FE593B','ARCHIVED','2015-03-21 21:44:51',0),('2015_06_26_00_characters_335.sql','f8230a59a9e878a6f54f421d6621f1595bd93861','ARCHIVED','2015-03-21 21:44:51',0),('2016_01_11_00_characters_from_335.sql','AAECE4BA6FDCF0C34A57FADD11DB68DAFD8AE9CD','ARCHIVED','2016-01-10 21:57:56',0),('2016_01_11_01_characters_from_335.sql','F8682A431D50E54BDC4AC0E7DBED21AE8AAB6AD4','ARCHIVED','2015-09-29 22:23:32',0),('2016_01_11_02_characters_from_335.sql','4555A7F35C107E54C13D74D20F141039ED42943E','ARCHIVED','2015-10-29 20:32:37',0),('2016_01_14_from_335_2015_10_06_00_characters.sql','16842FDD7E8547F2260D3312F53EFF8761EFAB35','ARCHIVED','2015-10-11 19:47:41',0),('2016_01_14_from_335_2015_10_07_00_characters.sql','E15AB463CEBE321001D7BFDEA4B662FF618728FD','ARCHIVED','2015-10-11 19:47:41',0),('2016_01_14_from_335_2015_10_12_00_characters.sql','D6F9927BDED72AD0A81D6EC2C6500CBC34A39FA2','ARCHIVED','2015-10-13 01:06:25',0),('2016_01_14_from_335_2015_10_28_00_characters.sql','622A9CA8FCE690429EBE23BA071A37C7A007BF8B','ARCHIVED','2015-10-28 21:49:52',0),('2016_01_14_from_335_2015_11_03_00_characters.sql','CC045717B8FDD9733351E52A5302560CD08AAD57','ARCHIVED','2015-11-03 22:56:17',0),('2016_02_21_from_335_2016_02_10_00_characters.sql','F1B4DA202819CABC7319A4470A2D224A34609E97','RELEASED','2016-02-10 00:00:00',0),('2016_03_12_00_characters.sql','0ACDD35EC9745231BCFA701B78056DEF94D0CC53','RELEASED','2016-03-12 00:00:00',0), ('2016_07_17_00_characters.sql', '41BF94C59FE13A61067E6721092F6187E184F37B', 'RELEASED', '2016-07-18 21:05:05', 0), ('2016_08_28_00_characters.sql', '111B0E4A6770A79093CC3CFFB9CE3475', 'RELEASED', '2016-08-28 21:05:05', 0);
|
||||
INSERT INTO `updates` VALUES ('2014_10_28_00_characters.sql','DCC0367E2784919FBE6ED44D60057179','ARCHIVED','2014-10-28 21:00:00',0),('2015_03_20_00_characters.sql','B761760804EA73BD297F296C5C1919687DF7191C','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_01_characters.sql','894F08B70449A5481FFAF394EE5571D7FC4D8A3A','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_02_characters.sql','97D7BE0CAADC79F3F11B9FD296B8C6CD40FE593B','ARCHIVED','2015-03-21 21:44:51',0),('2015_06_26_00_characters_335.sql','f8230a59a9e878a6f54f421d6621f1595bd93861','ARCHIVED','2015-03-21 21:44:51',0),('2016_01_11_00_characters_from_335.sql','AAECE4BA6FDCF0C34A57FADD11DB68DAFD8AE9CD','ARCHIVED','2016-01-10 21:57:56',0),('2016_01_11_01_characters_from_335.sql','F8682A431D50E54BDC4AC0E7DBED21AE8AAB6AD4','ARCHIVED','2015-09-29 22:23:32',0),('2016_01_11_02_characters_from_335.sql','4555A7F35C107E54C13D74D20F141039ED42943E','ARCHIVED','2015-10-29 20:32:37',0),('2016_01_14_from_335_2015_10_06_00_characters.sql','16842FDD7E8547F2260D3312F53EFF8761EFAB35','ARCHIVED','2015-10-11 19:47:41',0),('2016_01_14_from_335_2015_10_07_00_characters.sql','E15AB463CEBE321001D7BFDEA4B662FF618728FD','ARCHIVED','2015-10-11 19:47:41',0),('2016_01_14_from_335_2015_10_12_00_characters.sql','D6F9927BDED72AD0A81D6EC2C6500CBC34A39FA2','ARCHIVED','2015-10-13 01:06:25',0),('2016_01_14_from_335_2015_10_28_00_characters.sql','622A9CA8FCE690429EBE23BA071A37C7A007BF8B','ARCHIVED','2015-10-28 21:49:52',0),('2016_01_14_from_335_2015_11_03_00_characters.sql','CC045717B8FDD9733351E52A5302560CD08AAD57','ARCHIVED','2015-11-03 22:56:17',0),('2016_02_21_from_335_2016_02_10_00_characters.sql','F1B4DA202819CABC7319A4470A2D224A34609E97','RELEASED','2016-02-10 00:00:00',0),('2016_03_12_00_characters.sql','0ACDD35EC9745231BCFA701B78056DEF94D0CC53','RELEASED','2016-03-12 00:00:00',0), ('2016_07_17_00_characters.sql', '41BF94C59FE13A61067E6721092F6187E184F37B', 'RELEASED', '2016-07-18 21:05:05', 0), ('2016_08_28_00_characters.sql', '111B0E4A6770A79093CC3CFFB9CE3475', 'RELEASED', '2016-08-28 21:05:05', 0),('2016_09_14_00_characters_from_335_was_2016_09_13_00_characters.sql','27A04615B11B2CFC3A26778F52F74C071E4F9C54','RELEASED','2016-07-06 18:55:18',0);
|
||||
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
DROP TABLE IF EXISTS `character_fishingsteps`;
|
||||
CREATE TABLE `character_fishingsteps` (
|
||||
`guid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier',
|
||||
`fishingSteps` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`guid`)
|
||||
) ENGINE=INNODB DEFAULT CHARSET=utf8;
|
||||
@@ -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, talentTree, 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, "
|
||||
"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, "
|
||||
"health, power1, power2, power3, power4, power5, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels "
|
||||
"FROM characters WHERE guid = ?", CONNECTION_ASYNC);
|
||||
"health, power1, power2, power3, power4, power5, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, 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);
|
||||
@@ -565,6 +565,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);
|
||||
PrepareStatement(CHAR_UPD_CHAR_LIST_SLOT, "UPDATE characters SET slot = ? WHERE guid = ?", CONNECTION_ASYNC);
|
||||
|
||||
// Void Storage
|
||||
|
||||
@@ -488,6 +488,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_UPD_CHAR_LIST_SLOT,
|
||||
|
||||
CHAR_SEL_CHAR_VOID_STORAGE,
|
||||
|
||||
@@ -495,6 +495,7 @@ Player::Player(WorldSession* session): Unit(true)
|
||||
m_lastFallZ = 0;
|
||||
|
||||
m_grantableLevels = 0;
|
||||
m_fishingSteps = 0;
|
||||
|
||||
m_ControlledByPlayer = true;
|
||||
|
||||
@@ -4567,6 +4568,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);
|
||||
@@ -5731,17 +5736,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;
|
||||
|
||||
return UpdateSkillPro(SKILL_FISHING, chance*10, gathering_skill_gain);
|
||||
if (m_fishingSteps >= stepsNeededToLevelUp)
|
||||
{
|
||||
m_fishingSteps = 0;
|
||||
|
||||
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)
|
||||
@@ -17012,8 +17039,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
|
||||
//"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, "
|
||||
// 51 52 53 54 55 56 57 58 59 60 61
|
||||
//"health, power1, power2, power3, power4, power5, instance_id, speccount, activespec, exploredZones, equipmentCache, "
|
||||
// 62 63 64
|
||||
//"knownTitles, actionBars, grantableLevels FROM characters WHERE guid = '%u'", guid);
|
||||
// 62 63 64 65
|
||||
//"knownTitles, actionBars, grantableLevels, fishing_steps FROM characters WHERE guid = '%u'", guid);
|
||||
PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM);
|
||||
if (!result)
|
||||
{
|
||||
@@ -17125,6 +17152,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[63].GetUInt8());
|
||||
|
||||
m_fishingSteps = fields[65].GetUInt8();
|
||||
|
||||
InitDisplayIds();
|
||||
|
||||
// cleanup inventory related item value fields (it will be filled correctly in _LoadInventory)
|
||||
@@ -19292,9 +19321,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
|
||||
@@ -19415,7 +19449,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
|
||||
{
|
||||
@@ -19557,10 +19591,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);
|
||||
|
||||
|
||||
@@ -2785,6 +2785,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
|
||||
uint8 m_grantableLevels;
|
||||
|
||||
uint8 m_fishingSteps;
|
||||
|
||||
bool m_needsZoneUpdate;
|
||||
|
||||
CUFProfile* _CUFProfiles[MAX_CUF_PROFILES];
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#include "AccountMgr.h"
|
||||
#include "World.h"
|
||||
|
||||
#define DUMP_TABLE_COUNT 33
|
||||
#define DUMP_TABLE_COUNT 34
|
||||
struct DumpTable
|
||||
{
|
||||
char const* name;
|
||||
@@ -44,6 +44,7 @@ DumpTable const dumpTables[DUMP_TABLE_COUNT] =
|
||||
{ "character_cuf_profiles", 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 },
|
||||
|
||||
Reference in new issue
Block a user