• 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!

Compiling How to show health and mana(healing numbers)

eduardocosta

New Member
Joined
Aug 27, 2009
Messages
17
Reaction score
0
Hello team,
Could anyone help me with a code for 10.98 TFS-1.2 server?

After using HP and MP potions show the heal numbers. I need the code to compile (Visual Studio program) .
Ex:
ImWl4HQ.jpg

Thnx :)
 
Solution
try this
Lua:
local ultimateHealthPot = 8473
local greatHealthPot = 7591
local greatManaPot = 7590
local greatSpiritPot = 8472
local strongHealthPot = 7588
local strongManaPot = 7589
local healthPot = 7618
local manaPot = 7620
local smallHealthPot = 8704
local antidotePot = 8474
local greatEmptyPot = 7635
local strongEmptyPot = 7634
local emptyPot = 7636

local antidote = Combat()
antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING)
antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true)
antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false)
antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON)

local exhaust = Condition(CONDITION_EXHAUST_HEAL)...
HP print is turned on as default in tfs 1.2


For mana print:

in game.cpp
https://github.com/otland/forgottenserver/blob/master/src/game.cpp

find function
Code:
bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange, CombatOrigin origin)

find
Code:
target->changeMana(manaChange);

add some lines before it
Code:
        std::ostringstream strManaChange;
        strManaChange << "+" << manaChange;
        addAnimatedText(strManaChange.str(), target->getPosition(), TEXTCOLOR_PURPLE);
        target->changeMana(manaChange);

Haven't tested it, but should work
 
HP print is turned on as default in tfs 1.2


For mana print:

in game.cpp
https://github.com/otland/forgottenserver/blob/master/src/game.cpp

find function
Code:
bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange, CombatOrigin origin)

find
Code:
target->changeMana(manaChange);

add some lines before it
Code:
        std::ostringstream strManaChange;
        strManaChange << "+" << manaChange;
        addAnimatedText(strManaChange.str(), target->getPosition(), TEXTCOLOR_PURPLE);
        target->changeMana(manaChange);

Haven't tested it, but should work

Ty, but it's almost there, identifier "addAnimatedText" is undefined.

 
No, not entirely. They're not "disabled". Tibia changed the way they receive them. You can't use strings on them anymore. You send them using sendTextMessage now instead, this is a code to remove mana from a player and announcing with animated text:

Lua:
        local loseMana = math.min(damage, self:getMana())
        self:addMana(-loseMana)
        self:sendTextMessage(MESSAGE_DAMAGE_RECEIVED, ("You lose %d mana."):format(loseMana), position, loseMana, TEXTCOLOR_BLUE)

        position:sendMagicEffect(CONST_ME_LOSEENERGY)

        local name = self:getName()
        for _, player in ipairs(Game.getSpectators(position, false, true)) do
          if player ~= self then
            player:sendTextMessage(MESSAGE_DAMAGE_RECEIVED, ("%s loses %d mana."):format(name, loseMana), position, loseMana, TEXTCOLOR_BLUE)
          end
        end

You can base your code on this. If you don't understand the code I will help you. Basically you need to send it once to yourself and then iterate through players in screen using Game.getSpectators to make every player see this update if you want that to be. And it does require a text as well along with the animation, as you can see.
 
No, not entirely. They're not "disabled". Tibia changed the way they receive them. You can't use strings on them anymore. You send them using sendTextMessage now instead, this is a code to remove mana from a player and announcing with animated text:

Lua:
        local loseMana = math.min(damage, self:getMana())
        self:addMana(-loseMana)
        self:sendTextMessage(MESSAGE_DAMAGE_RECEIVED, ("You lose %d mana."):format(loseMana), position, loseMana, TEXTCOLOR_BLUE)

        position:sendMagicEffect(CONST_ME_LOSEENERGY)

        local name = self:getName()
        for _, player in ipairs(Game.getSpectators(position, false, true)) do
          if player ~= self then
            player:sendTextMessage(MESSAGE_DAMAGE_RECEIVED, ("%s loses %d mana."):format(name, loseMana), position, loseMana, TEXTCOLOR_BLUE)
          end
        end

You can base your code on this. If you don't understand the code I will help you. Basically you need to send it once to yourself and then iterate through players in screen using Game.getSpectators to make every player see this update if you want that to be. And it does require a text as well along with the animation, as you can see.

Yay! It did work, thanks. I just did a small function to use it:

Code:
-- working text_types = only those that sends a serverlog message

function sendAnimatedNumber(message_type, text, value, position, color)
    for _, v in ipairs(Game.getSpectators(position, false, true)) do
        if v:isPlayer() then
            v:sendTextMessage(message_type, text, position, value, color)
        end
    end
end

Also, isn't there a way to send an animated TEXT?
 
Yay! It did work, thanks. I just did a small function to use it:

Code:
-- working text_types = only those that sends a serverlog message

function sendAnimatedNumber(message_type, text, value, position, color)
    for _, v in ipairs(Game.getSpectators(position, false, true)) do
        if v:isPlayer() then
            v:sendTextMessage(message_type, text, position, value, color)
        end
    end
end

Also, isn't there a way to send an animated TEXT?
Nope
 
When I click on any potion show the heal number.
EX: this potions heals 1538 mp exactly as it is written on script ,I wanted these numbers to appearing.
ImWl4HQ.jpg
 
Well, if you locate your potions.lua script which should be in data/actions/other

In that code you'd find this:
Lua:
        if potion.mana then
            doTargetCombatMana(0, target, potion.mana[1], potion.mana[2], CONST_ME_MAGIC_BLUE)
        end

Unfortunately using this code we can't know what the mana is, so we need to remake it like this:
Lua:
        if potion.mana then
            local addMana = math.random(potion.mana[1], potion.mana[2])
            player:addMana(addMana)
            player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE)
        end

Now we can use this to display it:
Lua:
player:sendTextMessage(MESSAGE_HEALED, ("You gained %d mana."):format(addMana), player:getPosition(), addMana, TEXTCOLOR_BLUE)

This would now be shown above your character and white text in server log saying "You gained 120 mana."

However, only your character would see it. To make other players also see it we need to add this code as well:
Lua:
           local name = player:getName()
           for _, spectator in ipairs(Game.getSpectators(player:getPosition(), false, true)) do
             if spectator ~= player then
               spectator:sendTextMessage(MESSAGE_HEALED, ("%s gained %d mana."):format(name, addMana), player:getPosition(), addMana, TEXTCOLOR_BLUE)
             end
           end

Now it would work properly. Although I'm not sure which textcolor to use, I've used TEXTCOLOR_BLUE. Maybe TEXTCOLOR_PURPLE?

(all the code should be inside the if potion.mana then condition, so just before the end on first code shown)
 
My potions.lua is diferent (tfs 1.2) :


Lua:
local ultimateHealthPot = 8473
local greatHealthPot = 7591
local greatManaPot = 7590
local greatSpiritPot = 8472
local strongHealthPot = 7588
local strongManaPot = 7589
local healthPot = 7618
local manaPot = 7620
local smallHealthPot = 8704
local antidotePot = 8474
local greatEmptyPot = 7635
local strongEmptyPot = 7634
local emptyPot = 7636

local antidote = Combat()
antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING)
antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true)
antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false)
antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON)

local exhaust = Condition(CONDITION_EXHAUST_HEAL)
exhaust:setParameter(CONDITION_PARAM_TICKS, (configManager.getNumber(configKeys.EX_ACTIONS_DELAY_INTERVAL) +650))
-- 1000 - 100 due to exact condition timing. -100 doesn't hurt us, and players don't have reminding ~50ms exhaustion.

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if target == nil or not target:isPlayer() then
        return true
    end

    if player:getCondition(CONDITION_EXHAUST_HEAL) then
        player:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
        return true
    end

    local itemId = item:getId()
    if itemId == antidotePot then
        if not antidote:execute(target, numberToVariant(target:getId())) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == smallHealthPot then
        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 500, 500, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == healthPot then
        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 2000, 2700, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == manaPot then
        if not doTargetCombatMana(0, target, 2000, 2700, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == strongHealthPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 1000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 1000+.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 7400, 7600, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == strongManaPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 1000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 1000+.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatMana(0, target, 7400, 7600, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == greatSpiritPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 41000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 41000+.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 33000, 35000, CONST_ME_MAGIC_BLUE) or not doTargetCombatMana(0, target, 33000, 35000, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == greatHealthPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 6000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 6000+.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 13000, 15000, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == greatManaPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 6000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 6000+.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatMana(0, target, 13000, 15000, CONST_ME_MAGIC_BLUE) then
            return false
        end
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == ultimateHealthPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 41000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 41000+.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 33000, 35000, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    end
    return true
end
 
try this
Lua:
local ultimateHealthPot = 8473
local greatHealthPot = 7591
local greatManaPot = 7590
local greatSpiritPot = 8472
local strongHealthPot = 7588
local strongManaPot = 7589
local healthPot = 7618
local manaPot = 7620
local smallHealthPot = 8704
local antidotePot = 8474
local greatEmptyPot = 7635
local strongEmptyPot = 7634
local emptyPot = 7636

local antidote = Combat()
antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING)
antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true)
antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false)
antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON)

local exhaust = Condition(CONDITION_EXHAUST_HEAL)
exhaust:setParameter(CONDITION_PARAM_TICKS, (configManager.getNumber(configKeys.EX_ACTIONS_DELAY_INTERVAL) +650))
-- 1000 - 100 due to exact condition timing. -100 doesn't hurt us, and players don't have reminding ~50ms exhaustion.

local function sendManaNumbers(player, mana)
    player:sendTextMessage(MESSAGE_HEALED, ("You gained %d mana."):format(mana), player:getPosition(), mana, TEXTCOLOR_BLUE)
    local name = player:getName()
    for _, spectator in ipairs(Game.getSpectators(player:getPosition(), false, true)) do
        if spectator ~= player then
            spectator:sendTextMessage(MESSAGE_HEALED, ("%s gained %d mana."):format(name, mana), player:getPosition(), mana, TEXTCOLOR_BLUE)
        end
    end
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if target == nil or not target:isPlayer() then
        return true
    end

    if player:getCondition(CONDITION_EXHAUST_HEAL) then
        player:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
        return true
    end

    local itemId = item:getId()
    if itemId == antidotePot then
        if not antidote:execute(target, numberToVariant(target:getId())) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == smallHealthPot then
        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 500, 500, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == healthPot then
        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 2000, 2700, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == manaPot then
        local mana = math.random(2000, 2700)
        if not doTargetCombatMana(0, target, mana, mana, CONST_ME_MAGIC_BLUE) then
            return false
        end
        sendManaNumbers(player, mana)
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == strongHealthPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 1000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 1000+.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 7400, 7600, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == strongManaPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 1000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 1000+.", TALKTYPE_MONSTER_SAY)
            return true
        end
        local mana = math.random(7400, 7600)
        if not doTargetCombatMana(0, target, mana, mana, CONST_ME_MAGIC_BLUE) then
            return false
        end
        sendManaNumbers(player, mana)
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == greatSpiritPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 41000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 41000+.", TALKTYPE_MONSTER_SAY)
            return true
        end
        local mana = math.random(33000, 35000)
        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 33000, 35000, CONST_ME_MAGIC_BLUE) or not doTargetCombatMana(0, target, mana, mana, CONST_ME_MAGIC_BLUE) then
            return false
        end
        sendManaNumbers(player, mana)
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == greatHealthPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 6000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 6000+.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 13000, 15000, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == greatManaPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 6000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 6000+.", TALKTYPE_MONSTER_SAY)
            return true
        end
        local mana = math.random(13000, 15000)
        if not doTargetCombatMana(0, target, mana, mana, CONST_ME_MAGIC_BLUE) then
            return false
        end
        sendManaNumbers(player, mana)
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    elseif itemId == ultimateHealthPot then
        if (not isInArray({1,2,3,4,5,6,7,8}, target:getVocation():getId()) or target:getLevel() < 41000) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("Para level 41000+.", TALKTYPE_MONSTER_SAY)
            return true
        end

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 33000, 35000, CONST_ME_MAGIC_BLUE) then
            return false
        end

        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
    end
    return true
end
 
Last edited by a moderator:
Solution
Guys one more and last help, if I want create new potions with health and mana, how show health too?

I tried modifying just for MP , but I wanting for HP too for this code.
And MP show me a bug.

M0vLlQ7.jpg


Lua:
local restaurationPot = 15463
local emptyPot = 7636

local antidote = Combat()
antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING)
antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true)
antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false)
antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON)

local exhaust = Condition(CONDITION_EXHAUST_HEAL)
exhaust:setParameter(CONDITION_PARAM_TICKS, (configManager.getNumber(configKeys.EX_ACTIONS_DELAY_INTERVAL) - 400))
-- 1000 - 100 due to exact condition timing. -100 doesn't hurt us, and players don't have reminding ~50ms exhaustion.

local function sendManaNumbers(player, mana)
    player:sendTextMessage(MESSAGE_HEALED, ("You gained %d mana."):format(mana), player:getPosition(), mana, TEXTCOLOR_PURPLE)
    local name = player:getName()
    for _, spectator in ipairs(Game.getSpectators(player:getPosition(), false, true)) do
        if spectator ~= player then
            spectator:sendTextMessage(MESSAGE_HEALED, ("%s gained %d mana."):format(name, mana), player:getPosition(), mana, TEXTCOLOR_BLUE)
        end
    end
end



function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if target == nil or not target:isPlayer() then
        return true
    end

    if player:getCondition(CONDITION_EXHAUST_HEAL) then
        player:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
        return true
    end

        local itemId = item:getId()
    
            local itemId = item:getId()
    if itemId == antidotePot then
        if not antidote:execute(target, numberToVariant(target:getId())) then
            return false
        end
    elseif itemId == restaurationPot then
        if (not isInArray({1, 2, 3, 4, 5, 6, 7, 8}, target:getVocation():getId()) or target:getLevel() < 99) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can be consumed by all players of level 100 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end
    
    

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 50000, 50000, CONST_ME_MAGIC_BLUE) or not doTargetCombatMana(0, target, 50000, 50000, CONST_ME_MAGIC_BLUE) then
            return false
        end
        sendManaNumbers(player, mana)
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        Item(item.uid):remove(1)
        player:addItem(emptyPot, 1)
 
    return true
 
end
end
 
Last edited:
Guys one more and last help, if I want create new potions with health and mana, how show health too?

I tried modifying just for MP , but I wanting for HP too for this code.
And MP show me a bug.

M0vLlQ7.jpg


Lua:
local restaurationPot = 15463
local emptyPot = 7636

local antidote = Combat()
antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING)
antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true)
antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false)
antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON)

local exhaust = Condition(CONDITION_EXHAUST_HEAL)
exhaust:setParameter(CONDITION_PARAM_TICKS, (configManager.getNumber(configKeys.EX_ACTIONS_DELAY_INTERVAL) - 400))
-- 1000 - 100 due to exact condition timing. -100 doesn't hurt us, and players don't have reminding ~50ms exhaustion.

local function sendManaNumbers(player, mana)
    player:sendTextMessage(MESSAGE_HEALED, ("You gained %d mana."):format(mana), player:getPosition(), mana, TEXTCOLOR_PURPLE)
    local name = player:getName()
    for _, spectator in ipairs(Game.getSpectators(player:getPosition(), false, true)) do
        if spectator ~= player then
            spectator:sendTextMessage(MESSAGE_HEALED, ("%s gained %d mana."):format(name, mana), player:getPosition(), mana, TEXTCOLOR_BLUE)
        end
    end
end



function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if target == nil or not target:isPlayer() then
        return true
    end

    if player:getCondition(CONDITION_EXHAUST_HEAL) then
        player:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
        return true
    end

        local itemId = item:getId()
   
            local itemId = item:getId()
    if itemId == antidotePot then
        if not antidote:execute(target, numberToVariant(target:getId())) then
            return false
        end
    elseif itemId == restaurationPot then
        if (not isInArray({1, 2, 3, 4, 5, 6, 7, 8}, target:getVocation():getId()) or target:getLevel() < 99) and not getPlayerFlagValue(player, PlayerFlag_IgnoreSpellCheck) then
            player:say("This potion can be consumed by all players of level 100 or higher.", TALKTYPE_MONSTER_SAY)
            return true
        end
   
   

        if not doTargetCombatHealth(0, target, COMBAT_HEALING, 50000, 50000, CONST_ME_MAGIC_BLUE) or not doTargetCombatMana(0, target, 50000, 50000, CONST_ME_MAGIC_BLUE) then
            return false
        end
        sendManaNumbers(player, mana)
        player:addCondition(exhaust)
        target:say("Aaaah...", TALKTYPE_MONSTER_SAY)
        Item(item.uid):remove(1)
        player:addItem(emptyPot, 1)
 
    return true
 
end
end
hp should just be normal
you dont have to bother using the function to send numbers
 
how i can add number min/max of potion, not for random number
local config = {
-- strong health potion
[7588] = {health = {min = 375, max = 1050}, vocations = {3, 4}, text = 'paladins and knights', level = 50, emptyId = 7634},
-- strong mana potion
[7589] = {mana = {min = 675, max = 2250}, vocations = {1, 2}, text = 'sorcerers, druids', level = 50, emptyId = 7634},
-- great mana potion
[7590] = {mana = {min = 3500, max = 4500}, vocations = {1, 2}, text = 'sorcerers and druids', level = 80, emptyId = 7635},
-- great health potion
[7591] = {health = {min = 975, max = 2550}, vocations = {4}, text = 'knights', level = 80, emptyId = 7635},
-- health potion
[7618] = {health = {min = 188, max = 525}, emptyId = 7636},
-- mana potion
[7620] = {mana = {min = 113, max = 375}, emptyId = 7636},
-- great spirit potion
[8472] = {health = {min = 1500, max = 2500}, mana = {min = 800, max = 1600}, vocations = {3}, text = 'paladins', level = 130, emptyId = 7635},
-- ultimate health potion
[8473] = {health = {min = 3500, max = 4500}, mana = {min = 75, max = 125}, vocations = {4}, text = 'knights', level = 130, emptyId = 7635},
-- antidote potion
[8474] = {antidote = true, emptyId = 7636},
-- small health potion
[8704] = {health = {min = 90, max = 255}, emptyId = 7636}
}

local antidote = Combat()
antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING)
antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true)
antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false)
antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON)

local exhaust = Condition(CONDITION_EXHAUST_HEAL)
exhaust:setParameter(CONDITION_PARAM_TICKS, (configManager.getNumber(configKeys.EX_ACTIONS_DELAY_INTERVAL) - 1000))
-- 1000 - 100 due to exact condition timing. -100 doesn't hurt us, and players don't have reminding ~50ms exhaustion.

local function sendManaNumbers(player, mana)
player:sendTextMessage(MESSAGE_HEALED, ("You gained %d mana."):format(mana), player:getPosition(), mana, TEXTCOLOR_BLUE)
local name = player:getName()
for _, spectator in ipairs(Game.getSpectators(player:getPosition(), false, true)) do
if spectator ~= player then
spectator:sendTextMessage(MESSAGE_HEALED, ("%s gained %d mana."):format(name, mana), player:getPosition(), mana, TEXTCOLOR_BLUE)
end
end
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
local potion = config[item.itemid]
if not potion then
return true
end

if target.itemid ~= 1 or target.type ~= THING_TYPE_PLAYER then
return false
end

if player:getCondition(CONDITION_EXHAUST_HEAL) then
player:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
return true
end

if potion.antidote and not antidote:execute(target, Variant(target.uid)) then
return false
end

if (potion.level and player:getLevel() < potion.level)
or (type(potion.vocations) == 'table' and not isInArray(potion.vocations, player:getVocation():getBase():getId()))
and not (player:getGroup():getId() >= 2) then
player:say(string.format('This potion can only be consumed by %s of level %d or higher.', potion.text, potion.level), TALKTYPE_MONSTER_SAY)
return true
end

if type(potion.health) == 'table' and not doTargetCombatHealth(0, target, COMBAT_HEALING, potion.health.min, potion.health.max, CONST_ME_MAGIC_BLUE) then
return false
end

if type(potion.mana) == 'table' and not doTargetCombatMana(0, target, potion.mana.min, potion.mana.max, CONST_ME_MAGIC_BLUE) then
return false
end

player:addAchievementProgress('Potion Addict', 100000)

player:addCondition(exhaust)
doCreatureSayWithRadius(target, 'Aaaah...', TALKTYPE_MONSTER_SAY, 2, 2)
local mana = math.random(13000, 15000)
if not doTargetCombatMana(0, target, mana, mana, CONST_ME_MAGIC_BLUE) then
return false
end
sendManaNumbers(player, mana)
player:addCondition(exhaust)
target:say("Aaaah...", TALKTYPE_MONSTER_SAY)

local topParent = item:getTopParent()
if topParent.isItem and (not topParent:isItem() or topParent.itemid ~= 460) then
local parent = item:getParent()
end
return true
end
 
Back
Top