Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: wrong calculation from elemental damage for weapons #3187

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
Open
34 changes: 19 additions & 15 deletions src/items/weapons/weapons.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,6 @@ void Weapon::internalUseWeapon(const std::shared_ptr<Player> &player, const std:
var.type = VARIANT_NUMBER;
var.number = target->getID();
executeUseWeapon(player, var);
g_logger().debug("Weapon::internalUseWeapon - Lua callback executed.");
} else {
CombatDamage damage;
const WeaponType_t weaponType = item->getWeaponType();
Expand All @@ -257,12 +256,24 @@ void Weapon::internalUseWeapon(const std::shared_ptr<Player> &player, const std:
} else {
damage.origin = ORIGIN_MELEE;
}

damage.primary.type = params.combatType;
damage.primary.value = (getWeaponDamage(player, target, item) * damageModifier) / 100;
damage.secondary.type = getElementType();

// Cleave damage
const int32_t totalDamage = (getWeaponDamage(player, target, item) * damageModifier) / 100;
const int32_t physicalAttack = item->getAttack();
const int32_t elementalAttack = getElementDamageValue();
const int32_t combinedAttack = physicalAttack + elementalAttack;
if (elementalAttack > 0) {
float physicalPercentage = static_cast<float>(physicalAttack) / combinedAttack;
float elementalPercentage = static_cast<float>(elementalAttack) / combinedAttack;
damage.primary.value = static_cast<int32_t>(totalDamage * physicalPercentage);
damage.secondary.value = static_cast<int32_t>(totalDamage * elementalPercentage);
} else {
damage.primary.value = totalDamage;
damage.secondary.value = 0;
}

// Apply cleave adjustments if applicable
uint16_t damagePercent = 100;
if (cleavePercent != 0) {
damage.extension = true;
Expand All @@ -271,24 +282,17 @@ void Weapon::internalUseWeapon(const std::shared_ptr<Player> &player, const std:
damage.exString += ", ";
}
damage.exString += "cleave damage";
damage.primary.value = (damage.primary.value * damagePercent) / 100;
damage.secondary.value = (damage.secondary.value * damagePercent) / 100;
}

if (damage.secondary.type == COMBAT_NONE) {
damage.primary.value = (getWeaponDamage(player, target, item) * damageModifier / 100) * damagePercent / 100;
damage.secondary.value = 0;
} else {
damage.primary.value = (getWeaponDamage(player, target, item) * damageModifier / 100) * damagePercent / 100;
damage.secondary.value = (getElementDamage(player, target, item) * damageModifier / 100) * damagePercent / 100;
}

// Handle chain system
if (g_configManager().getBoolean(TOGGLE_CHAIN_SYSTEM) && params.chainCallback) {
m_combat->doCombatChain(player, target, params.aggressive);
g_logger().debug("Weapon::internalUseWeapon - Chain callback executed.");
} else {
Combat::doCombatHealth(player, target, damage, params);
}

g_logger().debug("Weapon::internalUseWeapon - cpp callback executed.");
}

onUsedWeapon(player, item, target->getTile());
Expand Down Expand Up @@ -629,7 +633,7 @@ int32_t WeaponMelee::getWeaponDamage(const std::shared_ptr<Player> &player, cons
return -maxValue;
}

return -normal_random(minValue, (maxValue * static_cast<int32_t>(player->getVocation()->meleeDamageMultiplier)));
return -normal_random(minValue, maxValue);
}

WeaponDistance::WeaponDistance() {
Expand Down
Loading