• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

How to have some quests pre-completed

jenaric.1

New Member
Joined
Feb 11, 2011
Messages
28
Reaction score
1
This question may be a bit silly, but I go about what I am trying to do in the most efficient way possible.

I am running TFS 1.2 RL project 10.77. This data pack https://otland.net/threads/10-77-tfs-1-2-orts-a-real-map-project.204514/

I have players on my forum requesting access to certain areas that they usually must complete quest to get to.

Why they do not want to complete the quests I do not know, probably laziness and need for instant gratification.

I want my players to have fun and stick around, so I would like to try my best to fulfill their wishes.

Is there a way to complete chunks of a players quest log? Do I just remove the quest xml and lua altogether? Or is there a better way?

Unfortunately I do not even play much Tibia, so when someone says they want Zao or Farmine, I do not even know where to start.

My current requests are WOTE -> 11 missions done, Lost Tomes all 12x tomes, and New frontier full 1-10 missions complete.

If you could point me in the direction of the most effective way to pre-complete these missions for my players I would be ever so grateful.

Thank you for your time. :)
 
You can use a loop and add the storage values to the players and then include the "access storage".
My tip would really be to look into the NPC code, then see what storages are sent out at what missions, what storages are required etc etc
I highly doubt anyone will do this for you for free, even if you pay since it really is a pain to serach through NPCs...

Another thing you can do (might take a while to get it) is to post an issue at the ORTS github, asking for a boolean config to check for "free quests".
Ex.
Code:
doesINQRequiresMissions = false
 
You can use a loop and add the storage values to the players and then include the "access storage".
My tip would really be to look into the NPC code, then see what storages are sent out at what missions, what storages are required etc etc
I highly doubt anyone will do this for you for free, even if you pay since it really is a pain to serach through NPCs...

Another thing you can do (might take a while to get it) is to post an issue at the ORTS github, asking for a boolean config to check for "free quests".
Ex.
Code:
doesINQRequiresMissions = false
I dont think they would do that, as they are working for a REAL tibia, so no quest skipping. Hope someone gives you all states :)
 
I dont think they would do that, as they are working for a REAL tibia, so no quest skipping. Hope someone gives you all states :)

If you start looking into ORTS you notice that like 80% is wrong, so id say they are more or less trying to mimic shadowcores, not cipsoft.
 
hey guys thanks for the replies it is much appreciated. In my login.lua I see this..

Code:
local events = {
    'TutorialCockroach',
    'ElementalSpheresOverlords',
    'BigfootBurdenVersperoth',
    'BigfootBurdenWarzone',
    'BigfootBurdenWeeper',
    'BigfootBurdenWiggler',
    'SvargrondArenaKill',
    'NewFrontierShardOfCorruption',
    'NewFrontierTirecz',
    'ServiceOfYalaharDiseasedTrio',
    'ServiceOfYalaharAzerus',
    'ServiceOfYalaharQuaraLeaders',
    'InquisitionBosses',
    'InquisitionUngreez',
    'KillingInTheNameOfKills',
    'MastersVoiceServants',
    'SecretServiceBlackKnight',
    'ThievesGuildNomad',
    'WotELizardMagistratus',
    'WotELizardNoble',
    'WotEKeeper',
    'WotEBosses',
    'WotEZalamon',
    'PlayerDeath',
    'AdvanceSave',
    'AdvanceRookgaard',
    'PythiusTheRotten',
    'DropLoot'
}

Is this designed to be where I would enter the storage values? If so, how would I go about writing them in?

I found this talk action over in the data thread and tried to implement it, but for whatever reason it did not work.

Code:
function onSay(player, words, param)

    -- local player = Player(cid) use this if you use function onSay(cid, words, param)

    local theNewFrontierPrice = 30000
    local wrathOfTheEmperorPrice = 30000
    local childrenOfRevolutionPrice = 30000

    -- THE NEW FRONTIER
    if param == 'The New Frontier' then
        if player:getStorageValue(Storage.TheNewFrontier.Questline) == 28 then
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'You have already done this quest.') -- White popup message
        elseif doPlayerRemoveMoney(player, theNewFrontierPrice) == TRUE then
            doSendMagicEffect(getPlayerPosition(player), CONST_ME_HOLYDAMAGE) -- Animation on player
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'Grats, you have completed TheNewFrontier, and gained all access.') -- White popup message
            player:setStorageValue(Storage.TheNewFrontier.Questline, 28) -- Set questline
            player:setStorageValue(Storage.TheNewFrontier.Mission01, 3); -- Mission01
            player:setStorageValue(Storage.TheNewFrontier.Mission02, 6); -- Mission02
            player:setStorageValue(Storage.TheNewFrontier.Mission03, 3); -- Mission03
            player:setStorageValue(Storage.TheNewFrontier.Mission04, 2); -- Mission04
            player:setStorageValue(Storage.TheNewFrontier.Mission05, 7); -- Mission05
            player:setStorageValue(Storage.TheNewFrontier.Mission06, 3); -- Mission06
            player:setStorageValue(Storage.TheNewFrontier.Mission07, 3); -- Mission07
            player:setStorageValue(Storage.TheNewFrontier.Mission08, 2); -- Mission08
            player:setStorageValue(Storage.TheNewFrontier.Mission09, 3); -- Mission09
            player:setStorageValue(Storage.TheNewFrontier.Mission10, 1); -- Mission10
            player:setStorageValue(Storage.TheNewFrontier.TomeofKnowledge, 13); -- TomeofKnowledge
            player:setStorageValue(Storage.TheNewFrontier.Beaver1, 1); -- Beaver1
            player:setStorageValue(Storage.TheNewFrontier.Beaver2, 1); -- Beaver2
            player:setStorageValue(Storage.TheNewFrontier.Beaver3, 1); -- Beaver3
            player:setStorageValue(Storage.TheNewFrontier.BribeKing, 1); -- BribeKing
            player:setStorageValue(Storage.TheNewFrontier.BribeLeeland, 1); -- BribeLeeland
            player:setStorageValue(Storage.TheNewFrontier.BribeExplorerSociety, 1); -- BribeExplorerSociety
            player:setStorageValue(Storage.TheNewFrontier.BribeWydrin, 1); -- BribeWydrin
            player:setStorageValue(Storage.TheNewFrontier.BribeTelas, 1); -- BribeTelas
            player:setStorageValue(Storage.TheNewFrontier.BribeHumgolf, 1); -- BribeHumgolf
        else
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You need 30,000gp to skip this quest.")
        end
    end

    -- WRATH OF THE EMPEROR
    if param == 'Wrath Of The Emperor' then
        if player:getStorageValue(Storage.WrathoftheEmperor.Questline) == 33 then
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'You have already done this quest.') -- White popup message
        elseif doPlayerRemoveMoney(player, wrathOfTheEmperorPrice) == TRUE then
            doSendMagicEffect(getPlayerPosition(player), CONST_ME_HOLYDAMAGE) -- Animation on player
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'Grats, you have completed WrathOfTheEmperor, and gained all access.') -- White popup message
            player:setStorageValue(Storage.WrathoftheEmperor.Questline, 33)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission01, 3)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission02, 3)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission03, 3)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission04, 3)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission05, 3)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission06, 4)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission07, 6)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission08, 2)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission09, 2)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission10, 6)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission11, 2)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission12, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.CrateStatus, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.GuardcaughtYou, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.ZumtahStatus, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.PrisonReleaseStatus, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.GhostOfAPriest01, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.GhostOfAPriest02, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.GhostOfAPriest03, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.InterdimensionalPotion, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.BossStatus, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.platinumReward, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.backpackReward, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.mainReward, 1)
        else
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You need 30,000gp to skip this quest.")
        end
    end

    -- CHILDREN OF REVOLUTION
    if param == 'Children Of Revolution' then
        if player:getStorageValue(Storage.ChildrenoftheRevolution.Questline) == 21 then
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'You have already done this quest.') -- White popup message
        elseif doPlayerRemoveMoney(player, childrenOfRevolutionPrice) == TRUE then
            doSendMagicEffect(getPlayerPosition(player), CONST_ME_HOLYDAMAGE) -- Animation on player
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'Grats, you have completed ChildrenOfRevolution, and gained all access.') -- White popup message
            player:setStorageValue(Storage.ChildrenoftheRevolution.Questline, 21)
            player:setStorageValue(Storage.ChildrenoftheRevolution.Mission01, 3)
            player:setStorageValue(Storage.ChildrenoftheRevolution.Mission02, 5)
            player:setStorageValue(Storage.ChildrenoftheRevolution.Mission03, 3)
            player:setStorageValue(Storage.ChildrenoftheRevolution.Mission04, 6)
            player:setStorageValue(Storage.ChildrenoftheRevolution.Mission05, 3)
            player:setStorageValue(Storage.ChildrenoftheRevolution.SpyBuilding01, 1)
            player:setStorageValue(Storage.ChildrenoftheRevolution.SpyBuilding02, 1)
            player:setStorageValue(Storage.ChildrenoftheRevolution.SpyBuilding03, 1)
            player:setStorageValue(Storage.ChildrenoftheRevolution.StrangeSymbols, 3)
        else
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You need 30,000gp to skip this quest.")   
        end
    end
end

If you can point me in the direction of why this talkaction does not work, I would be ever so grateful. If not, would the work around be to just put the list of storage values into the login.lua ? next to ie. 'NewFrontierShardOfCorruption',

Thank you so much for your help :D
 
hey guys thanks for the replies it is much appreciated. In my login.lua I see this..

Code:
local events = {
    'TutorialCockroach',
    'ElementalSpheresOverlords',
    'BigfootBurdenVersperoth',
    'BigfootBurdenWarzone',
    'BigfootBurdenWeeper',
    'BigfootBurdenWiggler',
    'SvargrondArenaKill',
    'NewFrontierShardOfCorruption',
    'NewFrontierTirecz',
    'ServiceOfYalaharDiseasedTrio',
    'ServiceOfYalaharAzerus',
    'ServiceOfYalaharQuaraLeaders',
    'InquisitionBosses',
    'InquisitionUngreez',
    'KillingInTheNameOfKills',
    'MastersVoiceServants',
    'SecretServiceBlackKnight',
    'ThievesGuildNomad',
    'WotELizardMagistratus',
    'WotELizardNoble',
    'WotEKeeper',
    'WotEBosses',
    'WotEZalamon',
    'PlayerDeath',
    'AdvanceSave',
    'AdvanceRookgaard',
    'PythiusTheRotten',
    'DropLoot'
}

Is this designed to be where I would enter the storage values? If so, how would I go about writing them in?

I found this talk action over in the data thread and tried to implement it, but for whatever reason it did not work.

Code:
function onSay(player, words, param)

    -- local player = Player(cid) use this if you use function onSay(cid, words, param)

    local theNewFrontierPrice = 30000
    local wrathOfTheEmperorPrice = 30000
    local childrenOfRevolutionPrice = 30000

    -- THE NEW FRONTIER
    if param == 'The New Frontier' then
        if player:getStorageValue(Storage.TheNewFrontier.Questline) == 28 then
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'You have already done this quest.') -- White popup message
        elseif doPlayerRemoveMoney(player, theNewFrontierPrice) == TRUE then
            doSendMagicEffect(getPlayerPosition(player), CONST_ME_HOLYDAMAGE) -- Animation on player
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'Grats, you have completed TheNewFrontier, and gained all access.') -- White popup message
            player:setStorageValue(Storage.TheNewFrontier.Questline, 28) -- Set questline
            player:setStorageValue(Storage.TheNewFrontier.Mission01, 3); -- Mission01
            player:setStorageValue(Storage.TheNewFrontier.Mission02, 6); -- Mission02
            player:setStorageValue(Storage.TheNewFrontier.Mission03, 3); -- Mission03
            player:setStorageValue(Storage.TheNewFrontier.Mission04, 2); -- Mission04
            player:setStorageValue(Storage.TheNewFrontier.Mission05, 7); -- Mission05
            player:setStorageValue(Storage.TheNewFrontier.Mission06, 3); -- Mission06
            player:setStorageValue(Storage.TheNewFrontier.Mission07, 3); -- Mission07
            player:setStorageValue(Storage.TheNewFrontier.Mission08, 2); -- Mission08
            player:setStorageValue(Storage.TheNewFrontier.Mission09, 3); -- Mission09
            player:setStorageValue(Storage.TheNewFrontier.Mission10, 1); -- Mission10
            player:setStorageValue(Storage.TheNewFrontier.TomeofKnowledge, 13); -- TomeofKnowledge
            player:setStorageValue(Storage.TheNewFrontier.Beaver1, 1); -- Beaver1
            player:setStorageValue(Storage.TheNewFrontier.Beaver2, 1); -- Beaver2
            player:setStorageValue(Storage.TheNewFrontier.Beaver3, 1); -- Beaver3
            player:setStorageValue(Storage.TheNewFrontier.BribeKing, 1); -- BribeKing
            player:setStorageValue(Storage.TheNewFrontier.BribeLeeland, 1); -- BribeLeeland
            player:setStorageValue(Storage.TheNewFrontier.BribeExplorerSociety, 1); -- BribeExplorerSociety
            player:setStorageValue(Storage.TheNewFrontier.BribeWydrin, 1); -- BribeWydrin
            player:setStorageValue(Storage.TheNewFrontier.BribeTelas, 1); -- BribeTelas
            player:setStorageValue(Storage.TheNewFrontier.BribeHumgolf, 1); -- BribeHumgolf
        else
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You need 30,000gp to skip this quest.")
        end
    end

    -- WRATH OF THE EMPEROR
    if param == 'Wrath Of The Emperor' then
        if player:getStorageValue(Storage.WrathoftheEmperor.Questline) == 33 then
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'You have already done this quest.') -- White popup message
        elseif doPlayerRemoveMoney(player, wrathOfTheEmperorPrice) == TRUE then
            doSendMagicEffect(getPlayerPosition(player), CONST_ME_HOLYDAMAGE) -- Animation on player
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'Grats, you have completed WrathOfTheEmperor, and gained all access.') -- White popup message
            player:setStorageValue(Storage.WrathoftheEmperor.Questline, 33)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission01, 3)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission02, 3)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission03, 3)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission04, 3)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission05, 3)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission06, 4)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission07, 6)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission08, 2)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission09, 2)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission10, 6)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission11, 2)
            player:setStorageValue(Storage.WrathoftheEmperor.Mission12, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.CrateStatus, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.GuardcaughtYou, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.ZumtahStatus, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.PrisonReleaseStatus, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.GhostOfAPriest01, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.GhostOfAPriest02, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.GhostOfAPriest03, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.InterdimensionalPotion, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.BossStatus, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.platinumReward, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.backpackReward, 1)
            player:setStorageValue(Storage.WrathoftheEmperor.mainReward, 1)
        else
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You need 30,000gp to skip this quest.")
        end
    end

    -- CHILDREN OF REVOLUTION
    if param == 'Children Of Revolution' then
        if player:getStorageValue(Storage.ChildrenoftheRevolution.Questline) == 21 then
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'You have already done this quest.') -- White popup message
        elseif doPlayerRemoveMoney(player, childrenOfRevolutionPrice) == TRUE then
            doSendMagicEffect(getPlayerPosition(player), CONST_ME_HOLYDAMAGE) -- Animation on player
            doPlayerSendTextMessage(player,MESSAGE_EVENT_ADVANCE,'Grats, you have completed ChildrenOfRevolution, and gained all access.') -- White popup message
            player:setStorageValue(Storage.ChildrenoftheRevolution.Questline, 21)
            player:setStorageValue(Storage.ChildrenoftheRevolution.Mission01, 3)
            player:setStorageValue(Storage.ChildrenoftheRevolution.Mission02, 5)
            player:setStorageValue(Storage.ChildrenoftheRevolution.Mission03, 3)
            player:setStorageValue(Storage.ChildrenoftheRevolution.Mission04, 6)
            player:setStorageValue(Storage.ChildrenoftheRevolution.Mission05, 3)
            player:setStorageValue(Storage.ChildrenoftheRevolution.SpyBuilding01, 1)
            player:setStorageValue(Storage.ChildrenoftheRevolution.SpyBuilding02, 1)
            player:setStorageValue(Storage.ChildrenoftheRevolution.SpyBuilding03, 1)
            player:setStorageValue(Storage.ChildrenoftheRevolution.StrangeSymbols, 3)
        else
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You need 30,000gp to skip this quest.") 
        end
    end
end

If you can point me in the direction of why this talkaction does not work, I would be ever so grateful. If not, would the work around be to just put the list of storage values into the login.lua ? next to ie. 'NewFrontierShardOfCorruption',

Thank you so much for your help :D

1. You don't need a semicolon as you use on some of them (not a bug, but as I said not needed :p)
2. Nest the if statments insted of opening and closing a bunch of them.
3. Post the error you get - if you get any.
4. Don't use compat functions, ex. doPlayerSendTextMessage(player => player:sendTextMessage(
5. Return a boolean value (this is the thing I expect could be the problem), mainly since it will cancel the "saying" if you return nothing (nil), compared to true (says the words) false (does not say the words, but executes the script).
6. Use player:removeMoney() insted of doPlayerRemoveMoney
 
Back
Top