Togu
Advanced OT User
The rune damage is the same for pvp and pvm.
I've made many source changes and I just found that bug now.
Here is my sudden_death_rune.lua:
I tried:
I think the error is on the source code, but the changes I've made on spells.cpp and combat.cpp are minimal and not related to runes, so I don't know how to correct that.
Is there some quick and easy way to compare my combat.cpp and spells.cpp with the original one?
Edit: I think I found it.
Original combat.cpp:
Edit:
Yeah, thats it.
I've introduced that bug when introducing the item abilities system found here in the cpp forum.
Solution found.
Close topic.
I've made many source changes and I just found that bug now.
Here is my sudden_death_rune.lua:
local combat = Combat()
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH)
function onGetFormulaValues(player, level, maglevel)
local min = (level / 5) + (maglevel * 4.3) + 32
local max = (level / 5) + (maglevel * 7.4) + 48
return -min, -max
end
combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
function onCastSpell(creature, variant, isHotkey)
return combat:execute(creature, variant)
end
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH)
function onGetFormulaValues(player, level, maglevel)
local min = (level / 5) + (maglevel * 4.3) + 32
local max = (level / 5) + (maglevel * 7.4) + 48
return -min, -max
end
combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
function onCastSpell(creature, variant, isHotkey)
return combat:execute(creature, variant)
end
I tried:
local combat = Combat()
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH)
function onCastSpell(creature, variant, isHotkey)
if creature.isMonster() then
local function onGetFormulaValues(player, level, maglevel)
local min = (level / 5) + (maglevel * 4.3) + 32
local max = (level / 5) + (maglevel * 7.4) + 48
return -min, -max
end
else
local function onGetFormulaValues(player, level, maglevel)
local min = (level / 5) + (maglevel * 4.3) + 32
local max = (level / 5) + (maglevel * 7.4) + 48
return -min/2, -max/2
end
end
combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
return combat:execute(creature, variant)
end
combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH)
function onCastSpell(creature, variant, isHotkey)
if creature.isMonster() then
local function onGetFormulaValues(player, level, maglevel)
local min = (level / 5) + (maglevel * 4.3) + 32
local max = (level / 5) + (maglevel * 7.4) + 48
return -min, -max
end
else
local function onGetFormulaValues(player, level, maglevel)
local min = (level / 5) + (maglevel * 4.3) + 32
local max = (level / 5) + (maglevel * 7.4) + 48
return -min/2, -max/2
end
end
combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues")
return combat:execute(creature, variant)
end
I think the error is on the source code, but the changes I've made on spells.cpp and combat.cpp are minimal and not related to runes, so I don't know how to correct that.
Is there some quick and easy way to compare my combat.cpp and spells.cpp with the original one?
Edit: I think I found it.
C++:
//CHANGED! BUG FIX SPECIAL CRITIC SKILLS
void Combat::CombatHealthFunc(Creature* caster, Creature* target, const CombatParams& params, CombatDamage* data)
{
assert(data);
CombatDamage damage = *data;
if (g_game.combatBlockHit(damage, caster, target, params.blockedByShield, params.blockedByArmor, params.itemId != 0)) {
return;
}
Player* attackerPlayer = caster ? caster->getPlayer() : nullptr;
Player* targetPlayer = target ? target->getPlayer() : nullptr;
if (attackerPlayer && damage.primary.value < 0 || damage.secondary.value < 0) {
uint16_t chance = attackerPlayer->getSpecialSkill(SPECIALSKILL_HITPOINTSLEECHCHANCE);
uint16_t skill = attackerPlayer->getSpecialSkill(SPECIALSKILL_HITPOINTSLEECHAMOUNT);
if (chance != 0 && uniform_random(1, 100) <= chance) {
CombatDamage lifeLeech;
lifeLeech.primary.value = std::round(damage.primary.value * (skill / 100.));
lifeLeech.primary.value += std::round(damage.secondary.value * (skill / 100.));
g_game.combatChangeHealth(nullptr, attackerPlayer, lifeLeech);
}
chance = attackerPlayer->getSpecialSkill(SPECIALSKILL_MANAPOINTSLEECHCHANCE);
skill = attackerPlayer->getSpecialSkill(SPECIALSKILL_MANAPOINTSLEECHAMOUNT);
if (chance != 0 && uniform_random(1, 100) <= chance) {
CombatDamage manaLeech;
manaLeech.primary.value = std::round(damage.primary.value * (skill / 100.));
manaLeech.primary.value += std::round(damage.secondary.value * (skill / 100.));
g_game.combatChangeMana(nullptr, attackerPlayer, manaLeech);
}
chance = attackerPlayer->getSpecialSkill(SPECIALSKILL_CRITICALHITCHANCE);
skill = attackerPlayer->getSpecialSkill(SPECIALSKILL_CRITICALHITAMOUNT);
if (chance != 0 && uniform_random(1, 100) <= chance) {
damage.primary.value += std::round(damage.primary.value * (skill / 100.));
damage.secondary.value += std::round(damage.secondary.value * (skill / 100.));
g_game.addMagicEffect(target->getPosition(), CONST_ME_CRITICAL_DAMAGE);
}
}
if (g_game.combatChangeHealth(caster, target, damage)) {
CombatConditionFunc(caster, target, params, &damage);
CombatDispelFunc(caster, target, params, nullptr);
}
}
Original combat.cpp:
C++:
void Combat::CombatHealthFunc(Creature* caster, Creature* target, const CombatParams& params, CombatDamage* data)
{
assert(data);
CombatDamage damage = *data;
if (g_game.combatBlockHit(damage, caster, target, params.blockedByShield, params.blockedByArmor, params.itemId != 0)) {
return;
}
if ((damage.primary.value < 0 || damage.secondary.value < 0) && caster) {
Player* targetPlayer = target->getPlayer();
if (targetPlayer && caster->getPlayer() && targetPlayer->getSkull() != SKULL_BLACK) {
damage.primary.value /= 2;
damage.secondary.value /= 2;
}
}
if (g_game.combatChangeHealth(caster, target, damage)) {
CombatConditionFunc(caster, target, params, &damage);
CombatDispelFunc(caster, target, params, nullptr);
}
}
Edit:
Yeah, thats it.
I've introduced that bug when introducing the item abilities system found here in the cpp forum.
Solution found.
Close topic.
Last edited: