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

C++ Does anyone have offline training TFS 0.3.6 \ When I use the actionid 1000 statue it logs out but the skills don't go up

samuel157

/root
Joined
Mar 19, 2010
Messages
518
Solutions
3
Reaction score
71
Location
São Paulo, Brazil
GitHub
Samuel10M
Does anyone have offline training TFS 0.3.6

XML:
--Offline Training--
<action itemid="8834" event="script" value="offlinetraining.lua"/>
<action itemid="10353" event="script" value="offlinetraining.lua"/>
<action itemid="8626" event="script" value="offlinetraining.lua"/>
<action itemid="1444" event="script" value="offlinetraining.lua"/>
<action itemid="10349" event="script" value="offlinetraining.lua"/>

LUA:
function onUse(cid, item, fromPosition, itemEx, toPosition)
   if(item.itemid == 1444) then -- sword
     doCreatureSetStorage(cid, 62669, SKILL_SWORD)
   elseif(item.itemid == 10349) then -- axe
     doCreatureSetStorage(cid, 62669, SKILL_AXE)
   elseif(item.itemid == 8834) then -- mlvl
     doCreatureSetStorage(cid, 62669, SKILL__MAGLEVEL)
   elseif(item.itemid == 8626) then -- club
     doCreatureSetStorage(cid, 62669, SKILL_CLUB)
   elseif(item.itemid == 10353) then -- distannce
     doCreatureSetStorage(cid, 62669, SKILL_DISTANCE)
   end
   if item.actionid == 1000 then
   doRemoveCreature(cid)
end
   return true
end

LUA:
function onLogout(cid)
    -- Verifica se o jogador pode começar o treino offline
    if OfflineTraining_canStartTraining(cid) then
        -- Inicia o treino offline
        OfflineTraining_turnOnTraining(cid)
        -- Executa ações ao iniciar o treino offline (como salvar estado, registrar tempo de início, etc.)
        OfflineTraining_onStartTraining(cid)
    end
    -- Define o tempo de logout do jogador, para calcular o tempo de treino offline
    OfflineTraining_setLogoutTime(cid)
    
    return true
end

LUA:
function onLogin(cid)
    -- Inicializa o sistema de treino offline para o jogador
    OfflineTraining_initialize(cid)
    
    -- Verifica se o jogador estava treinando enquanto estava offline
    if OfflineTraining_isTraining(cid) then
        -- Desliga o treino offline
        OfflineTraining_turnOffTraining(cid)
        
        -- Adiciona habilidades treinadas, considerando o menor valor entre o tempo offline e o tempo de treino offline disponível
        OfflineTraining_addTrainedSkills(cid, math.min(OfflineTraining_getTime(cid), OfflineTraining_getOfflineTime(cid)))
        
        -- Atualiza o tempo de treino offline, subtraindo o tempo que o jogador esteve offline
        OfflineTraining_setTime(cid, math.abs(OfflineTraining_getTime(cid) - OfflineTraining_getOfflineTime(cid)))
        
        -- Ação final após o término do treino offline
        OfflineTraining_onEndTraining(cid)
    else
        -- Se o jogador não estava treinando, aumenta o tempo de treino offline baseado no tempo que ele esteve offline
        OfflineTraining_setTime(cid, OfflineTraining_getTime(cid) + OfflineTraining_getOfflineTime(cid))
    end
    
    return true
end


LUA:
function onThink(interval) -- Executado a cada 60 segundos
    local playersOnline = getPlayersOnline() -- Obtém todos os jogadores online
    for _, cid in ipairs(playersOnline) do
        OfflineTraining_addTime(cid, 1) -- Adiciona 1 minuto ao tempo de treinamento offline
    end
    return true
end

LUA:
-- Configuração das taxas de treinamento offline, em porcentagem do treinamento normal
OfflineTraining_rates = {
    [SKILL_CLUB] = 100,
    [SKILL_SWORD] = 100,
    [SKILL_AXE] = 100,
    [SKILL_DISTANCE] = 100,
    [SKILL_SHIELD] = 100,
    [SKILL__MAGLEVEL] = 100
}

-- Função que verifica se o jogador pode iniciar o treinamento offline
function OfflineTraining_canStartTraining(cid)
    return getCreatureStorage(cid, 62669) > 0
end

-- Função executada ao iniciar o treinamento offline
function OfflineTraining_onStartTraining(cid)
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você começou o treinamento offline.")
end

-- Função executada ao finalizar o treinamento offline
function OfflineTraining_onEndTraining(cid)
    doCreatureSetStorage(cid, 62669, 0)
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Seu treinamento offline foi finalizado.")
end

-- Função para adicionar habilidades treinadas durante o tempo offline (em minutos)
function OfflineTraining_addTrainedSkills(cid, trainTime)
    local timeInSeconds = trainTime * 60
    local vocInfo = getVocationInfo(getPlayerVocation(cid))

    -- Adiciona o skill baseado no que está armazenado
    local trainingSkill = getCreatureStorage(cid, 62669)

    if trainingSkill == SKILL_SWORD then
        doPlayerAddSkillTry(cid, SKILL_SWORD, ((timeInSeconds * 1000) / vocInfo["attackSpeed"]) * OfflineTraining_rates[SKILL_SWORD] / 100, true)
    elseif trainingSkill == SKILL_AXE then
        doPlayerAddSkillTry(cid, SKILL_AXE, ((timeInSeconds * 1000) / vocInfo["attackSpeed"]) * OfflineTraining_rates[SKILL_AXE] / 100, true)
    elseif trainingSkill == SKILL__MAGLEVEL then
        doPlayerAddSpentMana(cid, ((timeInSeconds / vocInfo["manaGainTicks"]) * vocInfo["manaGain"]) * OfflineTraining_rates[SKILL__MAGLEVEL] / 100, true)
    elseif trainingSkill == SKILL_CLUB then
        doPlayerAddSkillTry(cid, SKILL_CLUB, ((timeInSeconds * 1000) / vocInfo["attackSpeed"]) * OfflineTraining_rates[SKILL_CLUB] / 100, true)
    elseif trainingSkill == SKILL_DISTANCE then
        doPlayerAddSkillTry(cid, SKILL_DISTANCE, ((timeInSeconds * 1000) / vocInfo["attackSpeed"]) * OfflineTraining_rates[SKILL_DISTANCE] / 100, true)
    end

    -- Adiciona progresso no skill de escudo (shield)
    doPlayerAddSkillTry(cid, SKILL_SHIELD, timeInSeconds * OfflineTraining_rates[SKILL_SHIELD] / 100, true)
end

-- Funções para manipular o tempo de treinamento offline
function OfflineTraining_getTime(cid)
    return getCreatureStorage(cid, 62666)
end

function OfflineTraining_setTime(cid, newTime)
    -- Define valores apenas entre 0 - 720 [12 horas]
    doCreatureSetStorage(cid, 62666, math.max(0, math.min(newTime, 720)))
    -- Força o servidor a enviar 'PlayerStats' (incluindo Offline Time)
    doPlayerAddSoul(cid, 1)
    doPlayerAddSoul(cid, -1)
end

function OfflineTraining_addTime(cid, addTime)
    OfflineTraining_setTime(cid, OfflineTraining_getTime(cid) + addTime)
end

function OfflineTraining_removeTime(cid, removeTime)
    OfflineTraining_setTime(cid, OfflineTraining_getTime(cid) - removeTime)
end

-- Funções de inicialização
function OfflineTraining_initialize(cid)
    if OfflineTraining_getTime(cid) == -1 then
        OfflineTraining_setTime(cid, 720)
        OfflineTraining_setLogoutTime(cid) -- Previne problemas com o primeiro login
    end
end

function OfflineTraining_isTraining(cid)
    return getCreatureStorage(cid, 62667) > 0
end

function OfflineTraining_turnOnTraining(cid)
    doCreatureSetStorage(cid, 62667, 1)
    OfflineTraining_onStartTraining(cid) -- Chama a função de início
end

function OfflineTraining_turnOffTraining(cid)
    doCreatureSetStorage(cid, 62667, 0)
    OfflineTraining_onEndTraining(cid) -- Chama a função de fim
end

function OfflineTraining_getOfflineTime(cid)
    return math.floor((os.time() - getCreatureStorage(cid, 62668)) / 60) -- Calcula o tempo offline em minutos
end

function OfflineTraining_setLogoutTime(cid)
    doCreatureSetStorage(cid, 62668, os.time())
end

-- Função chamada periodicamente (deve ser chamada a cada 60 segundos)
function onThink(interval)
    for _, cid in pairs(getPlayersOnline()) do
        if OfflineTraining_isTraining(cid) then
            local trainingTime = OfflineTraining_getOfflineTime(cid) -- Obtém o tempo de treinamento offline
            OfflineTraining_addTrainedSkills(cid, trainingTime) -- Adiciona habilidades treinadas
            OfflineTraining_setLogoutTime(cid) -- Atualiza o horário de logout
        end
    end
    return true
end

-- Função para iniciar o treinamento
function OfflineTraining_startTraining(cid)
    if OfflineTraining_canStartTraining(cid) then
        OfflineTraining_turnOnTraining(cid) -- Ativa o treinamento
    else
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você não pode iniciar o treinamento offline.")
    end
end
 
Last edited:
Back
Top