diff --git a/config.lua.dist b/config.lua.dist index aaf8b37e..1b0afc00 100644 --- a/config.lua.dist +++ b/config.lua.dist @@ -46,7 +46,6 @@ rookSlotAmmo = 0 -- NOTE: valid values for worldType are: "pvp", "no-pvp" and "pvp-enforced" -- NOTE: removeBeginningWeaponAmmunition: spears, arrows, bolt have endless ammo (allows training for paladins) -- NOTE: refundManaOnBeginningWeapons: wand of vortex and snakebite refund mana used (allows training for mages) --- NOTE: toggleExpertPvp enables the PvP frames, similar to Tibia RL. worldType = "pvp" hotkeyAimbotEnabled = true protectionLevel = 7 @@ -72,7 +71,11 @@ blackSkulledDeathHealth = 40 blackSkulledDeathMana = 0 fieldOwnershipDuration = 5 * 1000 loginProtectionPeriod = 10 * 1000 + +-- Expert PvP +-- NOTE: toggleExpertPvp enables the PvP frames, similar to Tibia RL. toggleExpertPvp = true +pvpExpertCanWalkThroughOtherPlayers = false; cleanProtectionZones = false diff --git a/src/config/config_enums.hpp b/src/config/config_enums.hpp index c4807969..c0831438 100644 --- a/src/config/config_enums.hpp +++ b/src/config/config_enums.hpp @@ -352,6 +352,7 @@ enum ConfigKey_t : uint16_t { BEDS_ONLY_PREMIUM, LOGIN_PROTECTION, TOGGLE_EXPERT_PVP, + EXPERT_PVP_CANWALKTHROUGHOTHERPLAYERS, SPELL_NAME_INSTEAD_WORDS, LOG_PLAYERS_STATEMENTS, TOGGLE_TEST_MODE, diff --git a/src/config/configmanager.cpp b/src/config/configmanager.cpp index 8b3a0d6d..4812af77 100644 --- a/src/config/configmanager.cpp +++ b/src/config/configmanager.cpp @@ -173,6 +173,7 @@ bool ConfigManager::load() { loadBoolConfig(L, CHAIN_SYSTEM_VIP_ONLY, "chainSystemVipOnly", false); loadBoolConfig(L, BEDS_ONLY_PREMIUM, "bedsOnlyPremium", true); loadBoolConfig(L, TOGGLE_EXPERT_PVP, "toggleExpertPvp", false); + loadBoolConfig(L, EXPERT_PVP_CANWALKTHROUGHOTHERPLAYERS, "pvpExpertCanWalkThroughOtherPlayers", false); loadBoolConfig(L, SPELL_NAME_INSTEAD_WORDS, "spellNameInsteadOfWords", false); loadBoolConfig(L, LOG_PLAYERS_STATEMENTS, "logPlayersStatements", false); loadBoolConfig(L, TOGGLE_TEST_MODE, "toggleTestMode", false); diff --git a/src/creatures/players/player.cpp b/src/creatures/players/player.cpp index 11750500..5c875dd8 100644 --- a/src/creatures/players/player.cpp +++ b/src/creatures/players/player.cpp @@ -1148,7 +1148,21 @@ bool Player::canWalkthrough(const std::shared_ptr &creature) { return true; } + bool expertPvpWalkThrough = g_configManager().getBoolean(TOGGLE_EXPERT_PVP) && g_configManager().getBoolean(EXPERT_PVP_CANWALKTHROUGHOTHERPLAYERS); const auto &player = creature->getPlayer(); + if (!player) { + if (expertPvpWalkThrough) { + if (const auto &monster = creature->getMonster()) { + if (!monster->isSummon() || !monster->getMaster()->getPlayer()) { + return false; + } + const auto master = monster->getMaster()->getPlayer(); + return master != getPlayer() && canWalkthrough(master); + } + } + return false; + } + const auto &monster = creature->getMonster(); const auto &npc = creature->getNpc(); if (monster) { @@ -1208,7 +1222,11 @@ bool Player::canWalkthroughEx(const std::shared_ptr &creature) const { const auto &npc = creature->getNpc(); if (player) { const auto &playerTile = player->getTile(); - return playerTile && (playerTile->hasFlag(TILESTATE_NOPVPZONE) || playerTile->hasFlag(TILESTATE_PROTECTIONZONE) || player->getLevel() <= static_cast(g_configManager().getNumber(PROTECTION_LEVEL)) || g_game().getWorldType() == WORLD_TYPE_NO_PVP); + if (g_configManager().getBoolean(TOGGLE_EXPERT_PVP) && g_configManager().getBoolean(EXPERT_PVP_CANWALKTHROUGHOTHERPLAYERS)) { + return playerTile != nullptr; + } else { + return playerTile && (playerTile->hasFlag(TILESTATE_NOPVPZONE) || playerTile->hasFlag(TILESTATE_PROTECTIONZONE) || player->getLevel() <= static_cast(g_configManager().getNumber(PROTECTION_LEVEL)) || g_game().getWorldType() == WORLD_TYPE_NO_PVP); + } } else if (npc) { const auto &tile = npc->getTile(); const auto &houseTile = std::dynamic_pointer_cast(tile); @@ -2434,10 +2452,15 @@ void Player::onChangeZone(ZoneType_t zone) { } } + bool expertPvp = g_configManager().getBoolean(TOGGLE_EXPERT_PVP); + bool expertPvpWalkThrough = g_configManager().getBoolean(EXPERT_PVP_CANWALKTHROUGHOTHERPLAYERS); + if (!expertPvp || (expertPvp && !expertPvpWalkThrough)) { + g_game().updateCreatureWalkthrough(static_self_cast()); + } + updateImbuementTrackerStats(); wheel()->onThink(true); wheel()->sendGiftOfLifeCooldown(); - g_game().updateCreatureWalkthrough(static_self_cast()); sendIcons(); g_events().eventPlayerOnChangeZone(static_self_cast(), zone);