• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

TFS 1.X+ Runes combat not identifying if it's player/monster

Togu

Advanced OT User
Joined
Jun 22, 2018
Messages
308
Solutions
1
Reaction score
183
Location
Brazil
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:
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

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

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:
Back
Top