From 6b90187b7d8096aa525668d221ea55fd68f59adf Mon Sep 17 00:00:00 2001 From: vasconcellosdevictor Date: Thu, 24 Oct 2024 14:18:18 -0300 Subject: [PATCH] mining test --- data/scripts/talkactions/god/add_skill.lua | 2 ++ src/creatures/combat/condition.cpp | 10 +++++++++ src/creatures/creatures_definitions.hpp | 22 +++++++++++-------- .../players/imbuements/imbuements.cpp | 2 ++ src/io/functions/iologindata_load_player.cpp | 4 ++-- src/io/functions/iologindata_save_player.cpp | 2 ++ src/io/iologindata.cpp | 2 +- src/items/functions/item/item_parse.cpp | 2 ++ src/items/functions/item/item_parse.hpp | 1 + src/items/item.cpp | 10 ++++----- src/items/items_definitions.hpp | 2 ++ src/lua/functions/core/game/lua_enums.cpp | 3 +++ src/server/network/protocol/protocolgame.cpp | 6 ++--- src/utils/tools.cpp | 6 +++++ 14 files changed, 54 insertions(+), 20 deletions(-) diff --git a/data/scripts/talkactions/god/add_skill.lua b/data/scripts/talkactions/god/add_skill.lua index 09d240ece4d..4d36d657fe1 100644 --- a/data/scripts/talkactions/god/add_skill.lua +++ b/data/scripts/talkactions/god/add_skill.lua @@ -11,6 +11,8 @@ local function getSkillId(skillName) return SKILL_SHIELD elseif skillName:sub(1, 4) == "fish" then return SKILL_FISHING + elseif skillName:sub(1, 4) == "mining" then + return SKILL_MINING else return SKILL_FIST end diff --git a/src/creatures/combat/condition.cpp b/src/creatures/combat/condition.cpp index ac28a63073c..b135eeb772b 100644 --- a/src/creatures/combat/condition.cpp +++ b/src/creatures/combat/condition.cpp @@ -889,6 +889,16 @@ bool ConditionAttributes::setParam(ConditionParam_t param, int32_t value) { return true; } + case CONDITION_PARAM_SKILL_MINING: { + skills[SKILL_MINING] = value; + return true; + } + + case CONDITION_PARAM_SKILL_MININGPERCENT: { + skillsPercent[SKILL_MINING] = value; + return true; + } + case CONDITION_PARAM_SKILL_CRITICAL_HIT_CHANCE: { skills[SKILL_CRITICAL_HIT_CHANCE] = value; return true; diff --git a/src/creatures/creatures_definitions.hpp b/src/creatures/creatures_definitions.hpp index 9ce7e067c8b..be3bbedc779 100644 --- a/src/creatures/creatures_definitions.hpp +++ b/src/creatures/creatures_definitions.hpp @@ -221,6 +221,8 @@ enum ConditionParam_t { CONDITION_PARAM_INCREASE_MANADRAINPERCENT = 80, CONDITION_PARAM_INCREASE_DROWNPERCENT = 81, CONDITION_PARAM_CHARM_CHANCE_MODIFIER = 82, + CONDITION_PARAM_SKILL_MINING = 83, + CONDITION_PARAM_SKILL_MININGPERCENT = 84, }; enum stats_t { @@ -412,15 +414,17 @@ enum skills_t : int8_t { SKILL_DISTANCE = 4, SKILL_SHIELD = 5, SKILL_FISHING = 6, - SKILL_CRITICAL_HIT_CHANCE = 7, - SKILL_CRITICAL_HIT_DAMAGE = 8, - SKILL_LIFE_LEECH_CHANCE = 9, - SKILL_LIFE_LEECH_AMOUNT = 10, - SKILL_MANA_LEECH_CHANCE = 11, - SKILL_MANA_LEECH_AMOUNT = 12, - - SKILL_MAGLEVEL = 13, - SKILL_LEVEL = 14, + SKILL_MINING = 7, + SKILL_CRITICAL_HIT_CHANCE = 8, + SKILL_CRITICAL_HIT_DAMAGE = 9, + SKILL_LIFE_LEECH_CHANCE = 10, + SKILL_LIFE_LEECH_AMOUNT = 11, + SKILL_MANA_LEECH_CHANCE = 12, + SKILL_MANA_LEECH_AMOUNT = 13, + + SKILL_MAGLEVEL = 14, + SKILL_LEVEL = 15, + SKILL_FIRST = SKILL_FIST, SKILL_LAST = SKILL_MANA_LEECH_AMOUNT diff --git a/src/creatures/players/imbuements/imbuements.cpp b/src/creatures/players/imbuements/imbuements.cpp index 06db26b7210..0552c7aa8a2 100644 --- a/src/creatures/players/imbuements/imbuements.cpp +++ b/src/creatures/players/imbuements/imbuements.cpp @@ -220,6 +220,8 @@ bool Imbuements::loadFromXml(bool /* reloading */) { } else if (tmpStrValue == "manaleech") { usenormalskill = 3; skillId = SKILL_MANA_LEECH_AMOUNT; + } else if (tmpStrValue == "mining") { + skillId = SKILL_MINING; } else { g_logger().warn("Unknow skill name {} in imbuement name {}", tmpStrValue, imbuement.name); continue; diff --git a/src/io/functions/iologindata_load_player.cpp b/src/io/functions/iologindata_load_player.cpp index 80881db361c..2a391f9209f 100644 --- a/src/io/functions/iologindata_load_player.cpp +++ b/src/io/functions/iologindata_load_player.cpp @@ -298,8 +298,8 @@ void IOLoginDataLoad::loadPlayerSkill(std::shared_ptr player, DBResult_p return; } - static const std::array skillNames = { "skill_fist", "skill_club", "skill_sword", "skill_axe", "skill_dist", "skill_shielding", "skill_fishing", "skill_critical_hit_chance", "skill_critical_hit_damage", "skill_life_leech_chance", "skill_life_leech_amount", "skill_mana_leech_chance", "skill_mana_leech_amount" }; - static const std::array skillNameTries = { "skill_fist_tries", "skill_club_tries", "skill_sword_tries", "skill_axe_tries", "skill_dist_tries", "skill_shielding_tries", "skill_fishing_tries", "skill_critical_hit_chance_tries", "skill_critical_hit_damage_tries", "skill_life_leech_chance_tries", "skill_life_leech_amount_tries", "skill_mana_leech_chance_tries", "skill_mana_leech_amount_tries" }; + static const std::array skillNames = { "skill_fist", "skill_club", "skill_sword", "skill_axe", "skill_dist", "skill_shielding", "skill_fishing", "skill_mining", "skill_critical_hit_chance", "skill_critical_hit_damage", "skill_life_leech_chance", "skill_life_leech_amount", "skill_mana_leech_chance", "skill_mana_leech_amount" }; + static const std::array skillNameTries = { "skill_fist_tries", "skill_club_tries", "skill_sword_tries", "skill_axe_tries", "skill_dist_tries", "skill_shielding_tries", "skill_fishing_tries", "skill_mining_tries", "skill_critical_hit_chance_tries", "skill_critical_hit_damage_tries", "skill_life_leech_chance_tries", "skill_life_leech_amount_tries", "skill_mana_leech_chance_tries", "skill_mana_leech_amount_tries" }; for (size_t i = 0; i < skillNames.size(); ++i) { uint16_t skillLevel = result->getNumber(skillNames[i]); uint64_t skillTries = result->getNumber(skillNameTries[i]); diff --git a/src/io/functions/iologindata_save_player.cpp b/src/io/functions/iologindata_save_player.cpp index a5caadd709c..16b1af390e5 100644 --- a/src/io/functions/iologindata_save_player.cpp +++ b/src/io/functions/iologindata_save_player.cpp @@ -277,6 +277,8 @@ bool IOLoginDataSave::savePlayerFirst(std::shared_ptr player) { query << "`skill_shielding_tries` = " << player->skills[SKILL_SHIELD].tries << ","; query << "`skill_fishing` = " << player->skills[SKILL_FISHING].level << ","; query << "`skill_fishing_tries` = " << player->skills[SKILL_FISHING].tries << ","; + query << "`skill_mining` = " << player->skills[SKILL_MINING].level << ","; + query << "`skill_mining_tries` = " << player->skills[SKILL_MINING].tries << ","; query << "`skill_critical_hit_chance` = " << player->skills[SKILL_CRITICAL_HIT_CHANCE].level << ","; query << "`skill_critical_hit_chance_tries` = " << player->skills[SKILL_CRITICAL_HIT_CHANCE].tries << ","; query << "`skill_critical_hit_damage` = " << player->skills[SKILL_CRITICAL_HIT_DAMAGE].level << ","; diff --git a/src/io/iologindata.cpp b/src/io/iologindata.cpp index d834f9d0984..a328fb25783 100644 --- a/src/io/iologindata.cpp +++ b/src/io/iologindata.cpp @@ -92,7 +92,7 @@ void IOLoginData::updateOnlineStatus(uint32_t guid, bool login) { Database::getInstance().executeQuery(query.str()); } -// The boolean "disableIrrelevantInfo" will deactivate the loading of information that is not relevant to the preload, for example, forge, bosstiary, etc. None of this we need to access if the player is offline +// XXXXX LOADPLAYERBYID The boolean "disableIrrelevantInfo" will deactivate the loading of information that is not relevant to the preload, for example, forge, bosstiary, etc. None of this we need to access if the player is offline bool IOLoginData::loadPlayerById(std::shared_ptr player, uint32_t id, bool disableIrrelevantInfo /* = true*/) { Database &db = Database::getInstance(); std::ostringstream query; diff --git a/src/items/functions/item/item_parse.cpp b/src/items/functions/item/item_parse.cpp index f9808e8f912..54d8af4c7e4 100644 --- a/src/items/functions/item/item_parse.cpp +++ b/src/items/functions/item/item_parse.cpp @@ -489,6 +489,8 @@ void ItemParse::parseSkills(const std::string &tmpStrValue, pugi::xml_attribute itemType.getAbilities().skills[SKILL_DISTANCE] = pugi::cast(valueAttribute.value()); } else if (stringValue == "skillfish") { itemType.getAbilities().skills[SKILL_FISHING] = pugi::cast(valueAttribute.value()); + } else if (stringValue == "skillmining") { + itemType.getAbilities().skills[SKILL_MINING] = pugi::cast(valueAttribute.value()); } else if (stringValue == "skillshield") { itemType.getAbilities().skills[SKILL_SHIELD] = pugi::cast(valueAttribute.value()); } else if (stringValue == "skillfist") { diff --git a/src/items/functions/item/item_parse.hpp b/src/items/functions/item/item_parse.hpp index 07137e969d9..2599e4c82e5 100644 --- a/src/items/functions/item/item_parse.hpp +++ b/src/items/functions/item/item_parse.hpp @@ -72,6 +72,7 @@ const phmap::flat_hash_map ItemParseAttribut { "skillclub", ITEM_PARSE_SKILLCLUB }, { "skilldist", ITEM_PARSE_SKILLDIST }, { "skillfish", ITEM_PARSE_SKILLFISH }, + { "skillmining", ITEM_PARSE_SKILLMINING }, { "skillshield", ITEM_PARSE_SKILLSHIELD }, { "skillfist", ITEM_PARSE_SKILLFIST }, { "criticalhitchance", ITEM_PARSE_CRITICALHITCHANCE }, diff --git a/src/items/item.cpp b/src/items/item.cpp index 16cae380f82..cb8986cc025 100644 --- a/src/items/item.cpp +++ b/src/items/item.cpp @@ -1238,7 +1238,7 @@ Item::getDescriptions(const ItemType &it, std::shared_ptr item /*= nullptr skillBoost = true; } - for (uint8_t i = SKILL_FIRST; i <= SKILL_FISHING; i++) { + for (uint8_t i = SKILL_FIRST; i <= SKILL_MINING; i++) { if (!it.abilities->skills[i]) { continue; } @@ -1646,7 +1646,7 @@ Item::getDescriptions(const ItemType &it, std::shared_ptr item /*= nullptr skillBoost = true; } - for (uint8_t i = SKILL_FIRST; i <= SKILL_FISHING; i++) { + for (uint8_t i = SKILL_FIRST; i <= SKILL_MINING; i++) { if (!it.abilities->skills[i]) { continue; } @@ -2098,7 +2098,7 @@ std::string Item::parseShowAttributesDescription(std::shared_ptr item, con } if (itemType.abilities) { - for (uint8_t i = SKILL_FIRST; i <= SKILL_FISHING; i++) { + for (uint8_t i = SKILL_FIRST; i <= SKILL_MINING; i++) { if (!itemType.abilities->skills[i]) { continue; } @@ -2396,7 +2396,7 @@ std::string Item::getDescription(const ItemType &it, int32_t lookDistance, std:: } if (it.abilities) { - for (uint8_t i = SKILL_FIRST; i <= SKILL_FISHING; i++) { + for (uint8_t i = SKILL_FIRST; i <= SKILL_MINING; i++) { if (!it.abilities->skills[i]) { continue; } @@ -2664,7 +2664,7 @@ std::string Item::getDescription(const ItemType &it, int32_t lookDistance, std:: } if (it.abilities) { - for (uint8_t i = SKILL_FIRST; i <= SKILL_FISHING; i++) { + for (uint8_t i = SKILL_FIRST; i <= SKILL_MINING; i++) { if (!it.abilities->skills[i]) { continue; } diff --git a/src/items/items_definitions.hpp b/src/items/items_definitions.hpp index badac532951..8dddd1b40ae 100644 --- a/src/items/items_definitions.hpp +++ b/src/items/items_definitions.hpp @@ -119,6 +119,7 @@ enum ReturnValue { RETURNVALUE_NOTENOUGHDISTANCELEVEL, RETURNVALUE_NOTENOUGHSHIELDLEVEL, RETURNVALUE_NOTENOUGHFISHLEVEL, + RETURNVALUE_NOTENOUGHMININGLEVEL, RETURNVALUE_REWARDCHESTISEMPTY, RETURNVALUE_REWARDCONTAINERISEMPTY, RETURNVALUE_CONTACTADMINISTRATOR, @@ -538,6 +539,7 @@ enum ItemParseAttributes_t { ITEM_PARSE_SKILLCLUB, ITEM_PARSE_SKILLDIST, ITEM_PARSE_SKILLFISH, + ITEM_PARSE_SKILLMINING, ITEM_PARSE_SKILLSHIELD, ITEM_PARSE_SKILLFIST, ITEM_PARSE_CRITICALHITCHANCE, diff --git a/src/lua/functions/core/game/lua_enums.cpp b/src/lua/functions/core/game/lua_enums.cpp index 706a23eb7ae..99ece79a6b3 100644 --- a/src/lua/functions/core/game/lua_enums.cpp +++ b/src/lua/functions/core/game/lua_enums.cpp @@ -375,6 +375,7 @@ void LuaEnums::initConditionParamEnums(lua_State* L) { registerEnum(L, CONDITION_PARAM_SKILL_DISTANCE); registerEnum(L, CONDITION_PARAM_SKILL_SHIELD); registerEnum(L, CONDITION_PARAM_SKILL_FISHING); + registerEnum(L, CONDITION_PARAM_SKILL_MINING); registerEnum(L, CONDITION_PARAM_SKILL_CRITICAL_HIT_CHANCE); registerEnum(L, CONDITION_PARAM_SKILL_CRITICAL_HIT_DAMAGE); registerEnum(L, CONDITION_PARAM_SKILL_LIFE_LEECH_CHANCE); @@ -396,6 +397,7 @@ void LuaEnums::initConditionParamEnums(lua_State* L) { registerEnum(L, CONDITION_PARAM_SKILL_DISTANCEPERCENT); registerEnum(L, CONDITION_PARAM_SKILL_SHIELDPERCENT); registerEnum(L, CONDITION_PARAM_SKILL_FISHINGPERCENT); + registerEnum(L, CONDITION_PARAM_SKILL_MININGPERCENT); registerEnum(L, CONDITION_PARAM_BUFF_SPELL); registerEnum(L, CONDITION_PARAM_SUBID); registerEnum(L, CONDITION_PARAM_FIELD); @@ -960,6 +962,7 @@ void LuaEnums::initSkillEnums(lua_State* L) { registerEnum(L, SKILL_DISTANCE); registerEnum(L, SKILL_SHIELD); registerEnum(L, SKILL_FISHING); + registerEnum(L, SKILL_MINING); registerEnum(L, SKILL_CRITICAL_HIT_CHANCE); registerEnum(L, SKILL_CRITICAL_HIT_DAMAGE); registerEnum(L, SKILL_LIFE_LEECH_CHANCE); diff --git a/src/server/network/protocol/protocolgame.cpp b/src/server/network/protocol/protocolgame.cpp index 2c0c3e59a1f..8c95f1d8f80 100644 --- a/src/server/network/protocol/protocolgame.cpp +++ b/src/server/network/protocol/protocolgame.cpp @@ -5835,7 +5835,7 @@ void ProtocolGame::sendMarketDetail(uint16_t itemId, uint8_t tier) { std::ostringstream ss; bool separator = false; - for (uint8_t i = SKILL_FIRST; i <= SKILL_FISHING; i++) { + for (uint8_t i = SKILL_FIRST; i <= SKILL_MINING; i++) { if (!it.abilities->skills[i]) { continue; } @@ -7794,7 +7794,7 @@ void ProtocolGame::AddPlayerSkills(NetworkMessage &msg) { msg.addByte(0xA1); if (oldProtocol) { - for (uint8_t i = SKILL_FIRST; i <= SKILL_FISHING; ++i) { + for (uint8_t i = SKILL_FIRST; i <= SKILL_MINING; ++i) { skills_t skill = static_cast(i); msg.add(std::min(player->getSkillLevel(skill), std::numeric_limits::max())); msg.add(player->getBaseSkill(skill)); @@ -7806,7 +7806,7 @@ void ProtocolGame::AddPlayerSkills(NetworkMessage &msg) { msg.add(player->getLoyaltyMagicLevel()); msg.add(player->getMagicLevelPercent() * 100); - for (uint8_t i = SKILL_FIRST; i <= SKILL_FISHING; ++i) { + for (uint8_t i = SKILL_FIRST; i <= SKILL_MINING; ++i) { skills_t skill = static_cast(i); msg.add(std::min(player->getSkillLevel(skill), std::numeric_limits::max())); msg.add(player->getBaseSkill(skill)); diff --git a/src/utils/tools.cpp b/src/utils/tools.cpp index 8df1fde1065..c4b9b57b4b8 100644 --- a/src/utils/tools.cpp +++ b/src/utils/tools.cpp @@ -965,6 +965,9 @@ std::string getSkillName(uint8_t skillid) { case SKILL_FISHING: return "fishing"; + case SKILL_MINING: + return "mining"; + case SKILL_CRITICAL_HIT_CHANCE: return "critical hit chance"; @@ -1487,6 +1490,9 @@ const char* getReturnMessage(ReturnValue value) { case RETURNVALUE_NOTENOUGHFISHLEVEL: return "You do not have enough fishing level"; + case RETURNVALUE_NOTENOUGHMININGLEVEL: + return "You do not have enough mining level"; + case RETURNVALUE_NOTPOSSIBLE: return "Sorry, not possible.";