@@ -303,9 +303,16 @@ void Weapon::internalUseWeapon(const std::shared_ptr<Player> &player, const std:
303303 }
304304
305305 // Handle chain system
306- if (player->checkChainSystem () && params.chainCallback ) {
307- m_combat->doCombatChain (player, target, params.aggressive );
308- g_logger ().debug (" Weapon::internalUseWeapon - Chain callback executed." );
306+ if (player->checkChainSystem ()) {
307+ const auto &selfWeapon = g_weapons ().getWeapon (item);
308+ if (selfWeapon) {
309+ m_combat->setupChain (selfWeapon);
310+ }
311+ if (!m_combat->doCombatChain (player, target, params.aggressive )) {
312+ Combat::doCombatHealth (player, target, damage, params);
313+ } else {
314+ g_logger ().debug (" Weapon::internalUseWeapon - Chain executed with distance effects." );
315+ }
309316 } else {
310317 Combat::doCombatHealth (player, target, damage, params);
311318 }
@@ -975,47 +982,7 @@ void WeaponWand::configureWeapon(const ItemType &it) {
975982}
976983
977984int32_t WeaponWand::getWeaponDamage (const std::shared_ptr<Player> &player, const std::shared_ptr<Creature> &, const std::shared_ptr<Item> &, bool maxDamage /* = false*/ ) const {
978- if (!player->checkChainSystem ()) {
979- float multiplier = 1 .0f ;
980- auto vocation = player->getVocation ();
981- if (vocation) {
982- multiplier = vocation->wandRodDamageMultiplier ;
983- }
984-
985- auto maxValue = static_cast <int32_t >(maxChange * multiplier);
986-
987- // Returns maximum damage or a random value between minChange and maxChange
988- return maxDamage ? -maxValue : -normal_random (minChange, maxValue);
989- }
990-
991- if (!g_configManager ().getBoolean (CHAIN_SYSTEM_MODIFY_MAGIC)) {
992- return maxDamage ? -maxChange : -normal_random (minChange, maxChange);
993- }
994-
995- // If chain system is enabled, calculates magic-based damage
996- int32_t attackSkill = 0 ;
997- int32_t attackValue = 0 ;
998- float attackFactor = 0.0 ;
999- [[maybe_unused]] int16_t elementAttack = 0 ;
1000- [[maybe_unused]] CombatDamage combatDamage;
1001- calculateSkillFormula (player, attackSkill, attackValue, attackFactor, elementAttack, combatDamage);
1002-
1003- const auto magLevel = player->getMagicLevel ();
1004- const auto level = player->getLevel ();
1005-
1006- // Check if level is greater than zero before performing division
1007- const auto levelDivision = level > 0 ? level / 5.0 : 0.0 ;
1008-
1009- const auto totalAttackValue = magLevel + attackValue;
1010-
1011- // Check if magLevel is greater than zero before performing division
1012- const auto magicLevelDivision = totalAttackValue > 0 ? totalAttackValue / 3.0 : 0.0 ;
1013-
1014- const double min = levelDivision + magicLevelDivision;
1015- const double max = levelDivision + totalAttackValue;
1016-
1017- // Returns the calculated maximum damage or a random value between the calculated minimum and maximum
1018- return maxDamage ? -max : -normal_random (min, max);
985+ return maxDamage ? -maxChange : -normal_random (minChange, maxChange);
1019986}
1020987
1021988int16_t WeaponWand::getElementDamageValue () const {
0 commit comments