• 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 [1.2] Soul Regen

Cornwallis

Member
Joined
Jan 3, 2010
Messages
480
Reaction score
16
Hello, I'm trying to add 5 soul regen to every character when they eat food similar to the health and mana regeneration. I also couldn't find the original soul regeneration system in the sources, could someone direct me? Here's what I've done:
players.cpp
HTML:
        condition->setParam(CONDITION_PARAM_SOULGAIN, 5);
        condition->setParam(CONDITION_PARAM_SOULTICKS, vocation->getSoulGainTicks() * 1000);
I added that with the original health and mana regeneration, and similarly in the player.lua file in the libs.
 
Last edited:
you can do this in lua :O

lib/player.lua
Code:
function Player.feed(self, food)
    local condition = self:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT)
    if condition then
        condition:setTicks(condition:getTicks() + (food * 1000))
    else
        local vocation = self:getVocation()
        if not vocation then
            return nil
        end

        foodCondition:setTicks(food * 1000)
        foodCondition:setParameter(CONDITION_PARAM_HEALTHGAIN, vocation:getHealthGainAmount())
        foodCondition:setParameter(CONDITION_PARAM_HEALTHTICKS, vocation:getHealthGainTicks() * 1000)
        foodCondition:setParameter(CONDITION_PARAM_MANAGAIN, vocation:getManaGainAmount())
        foodCondition:setParameter(CONDITION_PARAM_MANATICKS, vocation:getManaGainTicks() * 1000)
        foodCondition:setParameter(CONDITION_PARAM_SOULGAIN, 5)
        foodCondition:setParameter(CONDITION_PARAM_SOULTICKS, vocation:getSoulGainTicks() * 1000)

        self:addCondition(foodCondition)
    end
    return true
end

gm5FFoN.gif
 
untested
Code:
local function addSoul(player, value, gainTicks, time, endTime)
    player = Player(player)
    if not player or time >= endTime then
        return
    end
    player:addSoul(value)
    addEvent(addSoul, gainTicks, player:getId(), value, gainTicks, os.mtime(), endTime)
end

function Player.feed(self, food)
    local condition = self:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT)
    if condition then
        condition:setTicks(condition:getTicks() + (food * 1000))
        addSoul(self, 5, vocation:getSoulGainTicks() * 1000, os.mtime(), os.mtime() + condition:getTicks() + (food * 1000))
    else
        local vocation = self:getVocation()
        if not vocation then
            return nil
        end

        foodCondition:setTicks(food * 1000)
        foodCondition:setParameter(CONDITION_PARAM_HEALTHGAIN, vocation:getHealthGainAmount())
        foodCondition:setParameter(CONDITION_PARAM_HEALTHTICKS, vocation:getHealthGainTicks() * 1000)
        foodCondition:setParameter(CONDITION_PARAM_MANAGAIN, vocation:getManaGainAmount())
        foodCondition:setParameter(CONDITION_PARAM_MANATICKS, vocation:getManaGainTicks() * 1000)

        self:addCondition(foodCondition)
        addSoul(self, 5, vocation:getSoulGainTicks() * 1000, os.mtime(), os.mtime() + (food * 1000))
    end
    return true
end
 
Last edited:
I'm getting this error and I don't believe I've edited food.lua, and the food script is still working.
Code:
Lua Script Error: [Action Interface]
data/actions/scripts/other/food.lua:onUse
data/lib/core/player.lua:14: attempt to index global 'vocation' (a nil value)
stack traceback:
        [C]: in function '__index'
        data/lib/core/player.lua:14: in function 'feed'
        data/actions/scripts/other/food.lua:102: in function <data/actions/scripts/other/food.lua:92>
 
oops
Code:
function Player.feed(self, food)
    local condition = self:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT)
    local vocation = self:getVocation()
    if not vocation then
        return nil
    end
    if condition then
        condition:setTicks(condition:getTicks() + (food * 1000))
        addSoul(self, 5, vocation:getSoulGainTicks() * 1000, os.mtime(), os.mtime() + condition:getTicks() + (food * 1000))
    else

        foodCondition:setTicks(food * 1000)
        foodCondition:setParameter(CONDITION_PARAM_HEALTHGAIN, vocation:getHealthGainAmount())
        foodCondition:setParameter(CONDITION_PARAM_HEALTHTICKS, vocation:getHealthGainTicks() * 1000)
        foodCondition:setParameter(CONDITION_PARAM_MANAGAIN, vocation:getManaGainAmount())
        foodCondition:setParameter(CONDITION_PARAM_MANATICKS, vocation:getManaGainTicks() * 1000)

        self:addCondition(foodCondition)
        addSoul(self, 5, vocation:getSoulGainTicks() * 1000, os.mtime(), os.mtime() + (food * 1000))
    end
    return true
end
 
This works whenever I make new characters, which is no big deal, but not on existing characters, which is why I didn't catch it. It seems like any time I make changes to vocations.xml it doesn't load for older characters, would you know why that is?

EDIT: If I login and I'm full then it doesn't work.
 
Last edited:
In lib/core/player.lua, the first function for eating food:


Lua:
local foodCondition = Condition(CONDITION_REGENERATION, CONDITIONID_DEFAULT)

local soulCondition = Condition(CONDITION_SOUL, CONDITIONID_DEFAULT) --add another local condition for soul
soulCondition:setTicks(8 * 60 * 1000) --set your rate here, I have it 1/2 the speed of gaining exp
soulCondition:setParameter(CONDITION_PARAM_SOULGAIN, 1)

function Player.feed(self, food)
    local condition = self:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT)
    if condition then
        condition:setTicks(condition:getTicks() + (food * 1000))
    else
        local vocation = self:getVocation()
        if not vocation then
            return nil
        end

        foodCondition:setTicks(food * 1000)
        foodCondition:setParameter(CONDITION_PARAM_HEALTHGAIN, vocation:getHealthGainAmount())
        foodCondition:setParameter(CONDITION_PARAM_HEALTHTICKS, vocation:getHealthGainTicks() * 1000)
        foodCondition:setParameter(CONDITION_PARAM_MANAGAIN, vocation:getManaGainAmount())
        foodCondition:setParameter(CONDITION_PARAM_MANATICKS, vocation:getManaGainTicks() * 1000)

        self:addCondition(foodCondition)
        
        soulCondition:setParameter(CONDITION_PARAM_SOULTICKS, vocation:getSoulGainTicks() * 1000) --apply the parameter here
        self:addCondition(soulCondition)--add the condition here
    end
    return true
end
 
Back
Top