Forum o OTS i RL tibi

Najlepsze forum o OtS i RL tibi


#1 2008-03-01 22:28:31

Chelsea Fans

Administrator

Zarejestrowany: 2008-03-01
Posty: 16
Punktów :   

[8.0/8.1] Własny PET!

Skrypt jest autorstwa FedeVI ,lekko zmodyfikowany przezemnie.

Co potrafi nasz zwiezaczek:

1.Tak jak u Player ,mana i zycie wzrasta wraz z levelem.
2.Mozesz sprawic ze twoje zwierze zacznie mowic.
3.Pet moze gromadzic itemy w zaloznosci ile dasz mu miejsca (zaznaczone na czerwono).
4.Wraz z levelem zmienia sie  jego nazwa(zaznaczone na zielono)
5.Twoje zwierze posiada Magic Level, zwieksza sie on wraz z ucyciem czarow.
6.Pet posiada mane tak jak zwykly player,tyllko zeby ja odzyskac nie potrzebuje jedzenia.
7.Gdy ty albo  pet zginiecie muisz zaplaci u npc wskrzeszajacego zwierzaka zeby go odrodzic.
Dzieje sie to tylko wtedy gdy ty albo pet zginiesz(nie gdy sie wylogujesz)
8.Sila peta autoamtycznie sie zapisuje,wiec moze tylko sie zwiekszac.
9.Wpisujac odpowiednia komende dowiadujesz sie wszystko o swoim zwierzaku.
10.Mozesz zsummowac peta lub go zchowac kiedy tylko chcesz.

Pierwszy Krok

Tworzymy kolejno pliki w glownym folderze OTS'a (tam gdzie znajduje sie Config.Lua)

petConfig.lua

    Kod:
             
    frases = {"Men, im still exhausted!", "Ok, in one momment", "afff, again?!", "meh, one second"}
    lenght = 39 -- maximun lenght the !petsay can have...
    manaGainTicks = 3000 --\\   
                           --how fast the pet gains mana
    manaGainAmmount = 10 --//
    manaGainPerLevel = 20 -- mana that gains the pet for each level the player gain
    magicLevelRate = 0.25 -- how faster the pet will gain mlvl compared to real tibia, 0.5 = 2 times faster, 0.25 = 4 times faster and soo...
    base = 2000 --base storage. All storages will depend of this number
    storages = {
                petMag = base+1,
                petUid = base+2,
                petExha = base+3,
                petDamage = base+4,
                petManaSpent = base+5,
                petIsOnline = base+6,
                petMana = base+7,
                petIsHealing = base+8,
                petCap = base+9
                }

    petItems = {}
    maxItems = 20 --Max items the pet can carry
    for i = 1, maxItems do
        petItems[i] = base+9+i
    end
    --Pets, dependiong on the level
    pets = {{level = 100, name = "GoD Demon"},
            {level = 60, name = "Demon Lord"},
            {level = 50, name = "Dark Demon"},
            {level = 40, name = "Fire Demon"},
            {level = 30, name = "Demon Senior"},
            {level = 20, name = "Black Demon"},
            {level = 10, name = "Demon Junior"},
            {level = 0, name = "Demonek"}
            }
    --attacks of the pet. !petattack "param
    --It's pretty easy how to config, I think it doesn't need an extra explanation.
    attacks = {{param = "energy", offensive = 1, needLevel = 20, self = 0, needMag = 10, manaSpent = 60exhausted = 1, range = 6,
    combatType = COMBAT_ENERGYDAMAGE, combatAni = CONST_ME_ENERGYAREA, area = 2,
                        formula = {maxb = 0.4, maxa = 30, minb = 0.5, mina = 0},
                     },
                     {param = "exori", offensive = 1, needLevel = 40, self = 0, needMag = 5, manaSpent = 145,
    exhausted = 1, range = 0, combatType = COMBAT_PHYSICALDAMAGE, combatAni = CONST_ME_HITAREA, area = 2,
                        formula = {maxb = 0.6, maxa = 30, minb = 1.2, mina = 0},
                     },
                     {param = "fireball", offensive = 1,  needLevel = 50, self = 0, needMag = 15, manaSpent = 100,
    exhausted = 1, range = 3, combatType = COMBAT_FIREDAMAGE, combatAni = CONST_ME_FIREAREA, area = 6,
                        formula = {maxb = 0.6, maxa = 30, minb = 1.2, mina = 0}
                     },
                     {param = "mini energy", offensive = 1,  needLevel = 0, self = 0, needMag = 0, manaSpent = 20,
    exhausted = 1, range = 1, combatType = COMBAT_ENERGYDAMAGE, combatAni = CONST_ME_ENERGYAREA, area = 1,
                        formula = {maxb = 0.13, maxa = 0, minb = 0.262, mina = 0}
                     },
                     {param = "health", offensive = -1,  needLevel = 10, self = 1, needMag = 0, manaSpent = 100,
    exhausted = 2, range = 0, combatType = COMBAT_HEALING, combatAni = CONST_ME_MAGIC_BLUE, area = 1,
                        formula = {maxb = 0.4, maxa = 20, minb = 0.7, mina = 0}
                     }
                    }
    function addMana(a)
        local cid = a.cid
        local petManaMax = getPlayerLevel(cid)*manaGainPerLevel
        if getPlayerStorageValue(cid, storages.petMana) < petManaMax then
            if petManaMax - getPlayerStorageValue(cid, storages.petMana) < 10 then
                setPlayerStorageValue(cid, storages.petMana, getPlayerStorageValue(cid, storages.petMana) + petManaMax -
    getPlayerStorageValue(cid, storages.petMana))
            else
                setPlayerStorageValue(cid, storages.petMana, getPlayerStorageValue(cid, storages.petMana) + 10)
            end
        addEvent(addMana, manaGainTicks, {cid = cid})
        else
            setPlayerStorageValue(cid, storages.petIsHealing, 0)
        end
    end

!petinfo.lua

    Kod:
    dofile("./petConfig.lua")
    function onSay(cid, words, param)
        local request = 0
        local daPet = getPlayerStorageValue(cid, storages.petUid)
        if isCreature(daPet) == 1 then
            param = string.lower(param)
            if param == "magic level" then
                request = getPlayerStorageValue(cid, storages.petMag)
            elseif param == "mana" then       
                request = getPlayerStorageValue(cid, storages.petMana)
            elseif param == "health" then
                request = getCreatureHealth(daPet)
            end
            if request ~= 0 then
                doPlayerSendTextMessage(cid, 19, 'Pet ' .. param .. ': ' .. request .. '.')
            end
        else
            doPlayerSendCancel(cid, 'You haven\'t call your pet!')
        end
        return FALSE
    end

!petsay.lua

    Kod:
    dofile("./petConfig.lua")
    function onSay(cid, words, param)

        local daPet = getPlayerStorageValue(cid, storages.petUid)
        if isCreature(daPet) == 1 then
            if param ~= nil then
                if string.len(param) < lenght then       
                    doCreatureSay(daPet, '' .. param .. '', TALKTYPE_ORANGE_1)
                else
                    doPlayerSendCancel(cid, 'No more than ' .. lenght .. ' character. ')
                end
            else
                doPlayerSendCancel(cid, 'You must enter a text')
            end       
        else
            doPlayerSendCancel(cid, 'You haven\'t call your pet!')
        end   
        return FALSE
    end

!petcarry.lua

Kod:

    dofile("./petConfig.lua")


    function onSay(cid, words, param)
        local mySto = 0
        local daPet = getPlayerStorageValue(cid, storages.petUid)
        if param == "clear" then
            for i = 1, table.maxn(petItems) do
                doCreatureSay(daPet, '' .. petItems[i] .. '', TALKTYPE_ORANGE_1)
            end
        end
        if isCreature(daPet) == 1 then
            local pos = getCreaturePosition(daPet)
            local a = 1
            while a < 10 do
                if getItemWeight(getThingfromPos({x = pos.x, y = pos.y, z = pos.z, stackpos = a}).itemid, 1) ~= 0  then
                    break
                end
                a = a + 1
            end
            local carryingItem = getThingfromPos({x = pos.x, y = pos.y, z = pos.z, stackpos = a})
            if getItemWeight(carryingItem.itemid, 1) ~= 0 then
                if isContainer(carryingItem.uid) == 0 then
                for b = 1, table.maxn(petItems) do
                    if getPlayerStorageValue(cid, petItems) == 0 or getPlayerStorageValue(cid, petItems[b]) == -1 then
                        mySto = b
                        break
                    end
                end
                    if mySto ~= 0 then
                        local theID = carryingItem.itemid
                        if isItemStackable(theID) == 1 then
                            doRemoveItem(carryingItem.uid, carryingItem.type)
                        else
                            doRemoveItem(carryingItem.uid, 1)
                        end
                        setPlayerStorageValue(cid, petItems[mySto], theID)
                        doCreatureSay(daPet, 'Hmm, ' .. getItemName(theID) .. ', I\'ll save it on my ' .. mySto .. ' bag!', TALKTYPE_ORANGE_1)
                    else
                        doCreatureSay(daPet, 'I have no space!', TALKTYPE_ORANGE_1)
                    end
                else
                    doCreatureSay(daPet, 'I can\'t take containers!', TALKTYPE_ORANGE_1)
                end
            else
                doCreatureSay(daPet, 'I can\'t see any item!', TALKTYPE_ORANGE_1)
            end
        else
            doPlayerSendCancel(cid, 'You haven\'t call your pet!')
        end
        return FALSE
    end

[b]!pet.lua

Kod:

    dofile("./petConfig.lua")



    function doPlayerAddSummon(cid, name, pos)
        local MyCreature = doSummonCreature(name, pos)   
        doConvinceCreature(cid, MyCreature)
        return MyCreature
    end


    local myPet = ""
    local myPetUid = 0

    function onSay(cid, words, param)


        if getPlayerStorageValue(cid, storages.petMag) == -1 then
            setPlayerStorageValue(cid, storages.petMag, 0)
        end

        if isCreature(getPlayerStorageValue(cid, storages.petUid)) == 0 then
            if getTilePzInfo(getCreaturePosition(cid)) == 0 then
                if getPlayerStorageValue(cid, storages.petIsOnline) == 1 or getPlayerStorageValue(cid, storages.petIsOnline) == -1 then
                    for i = 1, table.maxn(pets) do
                        if pets[i].level <= getPlayerLevel(cid) then
                            myPet = pets[i].name
                            break
                        end
                    end
                    myPetUid = doPlayerAddSummon(cid, myPet, getCreaturePosition(cid))
                    setPlayerStorageValue(cid, storages.petUid, myPetUid)
                    if myPetUid ~= -1 then
                        if getPlayerStorageValue(cid, storages.petDamage) ~= 0 and getPlayerStorageValue(cid, storages.petDamage) ~= -1  then
                            if getPlayerStorageValue(cid, storages.petDamage) < getCreatureMaxHealth(getPlayerStorageValue(cid, storages.petUid)) then
                                doCreatureAddHealth(getPlayerStorageValue(cid, storages.petUid), getPlayerStorageValue(cid, storages.petDamage)*-1)
                            end
                        end
                        doChangeSpeed(myPetUid, getCreatureBaseSpeed(cid) - getCreatureBaseSpeed(myPetUid))
                        doCreatureSay(myPetUid, 'Hello!', TALKTYPE_ORANGE_1)
                        addMana({cid = cid})
                        setPlayerStorageValue(cid, storages.petIsOnline, 2)
                    else
                        doPlayerSendCancel(cid, 'Not enought room.')
                    end
                else           
                    doPlayerSendCancel(cid, 'Your pet died! You have to revive it.')
                end
            else
                doPlayerSendCancel(cid, 'You cannot summon your pet in PZ.')
            end       
        else
        local daPet = getPlayerStorageValue(cid, storages.petUid)
            setPlayerStorageValue(cid, storages.petDamage, getCreatureMaxHealth(daPet) - getCreatureHealth(daPet))
            doCreatureSay(daPet, 'Byebye !', TALKTYPE_ORANGE_1)
            setPlayerStorageValue(cid, storages.petIsOnline, 1)
            doSendMagicEffect(getCreaturePosition(daPet), CONST_ME_POFF)
            doRemoveCreature(daPet)
        end
        return FALSE
    end

!petattack

    Kod:
    dofile("./petConfig.lua")


    function onSay(cid, words, param)


        local lookDirs = {[0] = {x = 0, y = -1},
                          [1] = {x = 1, y = 0},
                          [2] = {x = 0, y = 1},
                          [3] = {x = -1, y = 0}
                         }

        local myAttack = 0
        local TIEMPO_ESPERA = 0     
        local CRONOMETRO = 0
        local CRONOMETRO2 = 0
        local TIEMPO = 0

        function formulaAttack(magicLevel, level, maxb, maxa, minb, mina)
            return {minD = (level * 2 + magicLevel * 3) * (1 + mina) + minb,
                    maxD = (level * 2 + magicLevel * 3) * (1 + maxb) + maxa
                   }
        end

        function getPetMlvl(manaSpent)
            local i = 0
            while manaSpent >= (1600 * (1.2^i))*magicLevelRate do
                i = i + 1
            end
            return i
        end

        local daPet = getPlayerStorageValue(cid, storages.petUid)
        if isCreature(daPet) == 1 then
            if param ~= nil then

                param = string.lower(param)
                local petPos = getCreaturePosition(daPet)
                local lookDir = getPlayerLookDir(cid) -- getPlayerLookDir(daPet plz ! ! !)
                local damage = {}
                CRONOMETRO = getPlayerStorageValue(cid, storages.petExha)
                CRONOMETRO2 = os.clock()
                TIEMPO = os.difftime(CRONOMETRO2, CRONOMETRO)
                if TIEMPO_ESPERA - TIEMPO > TIEMPO_ESPERA or CRONOMETRO == -1 then
                    setPlayerStorageValue(cid, storages.petExha, CRONOMETRO2+1)
                end
                for i = 1, table.maxn(attacks) do
                    if param == attacks[i].param then
                        myAttack = i
                        break
                    end
                end
                if myAttack ~= 0 then
                    if getPlayerStorageValue(cid, storages.petMana) >= attacks[myAttack].manaSpent then
                        if attacks[myAttack].needLevel <= getPlayerLevel(cid) and attacks[myAttack].needMag <=
    getPlayerStorageValue(cid, storages.petMag) then
                            if attacks[myAttack].exhausted - TIEMPO <= 0 then
                                damage = formulaAttack(getPlayerStorageValue(cid, storages.petMag),
    getPlayerLevel(cid),  attacks[myAttack].formula.maxb, attacks[myAttack].formula.maxa, attacks[myAttack].formula.minb,
    attacks[myAttack].formula.mina)
                                doAreaCombatHealth(daPet*((attacks[myAttack].self - 1)*-1),
    attacks[myAttack].combatType, {x = petPos.x + attacks[myAttack].range*lookDirs[lookDir].x, y = petPos.y + attacks[myAttack].range*lookDirs[lookDir].y, z = petPos.z},
    attacks[myAttack].area, math.floor(damage.minD*-1*attacks[myAttack].offensive), math.floor(damage.maxD*-1*attacks[myAttack].offensive), attacks[myAttack].combatAni)
                                doCreatureSay(daPet, '' .. param .. '!', TALKTYPE_ORANGE_1)
                                if getPlayerStorageValue(cid, storages.petIsHealing) == 0 or
    getPlayerStorageValue(cid, storages.petIsHealing) == -1 then
                                    addEvent(addMana, manaGainTicks, {cid = cid})
                                    setPlayerStorageValue(cid, storages.petIsHealing, 1)
                                end
                                setPlayerStorageValue(cid, storages.petExha, CRONOMETRO2+1)
                                setPlayerStorageValue(cid, storages.petManaSpent, getPlayerStorageValue(cid, storages.petManaSpent) +
    attacks[myAttack].manaSpent)
                                setPlayerStorageValue(cid, storages.petMana, getPlayerStorageValue(cid, storages.petMana) - attacks[myAttack].manaSpent)
                                if getPetMlvl(getPlayerStorageValue(cid, storages.petManaSpent)) > getPlayerStorageValue(cid, storages.petMag) then
                                    setPlayerStorageValue(cid,  storages.petMag, getPetMlvl(getPlayerStorageValue(cid, storages.petManaSpent)))
                                    doCreatureSay(daPet, 'You advanced to magic level ' .. getPlayerStorageValue(cid, storages.petMag) .. '!', TALKTYPE_ORANGE_1)
                                end
                            else
                                doCreatureSay(daPet, '' .. frases[math.random(1, table.maxn(frases))] .. '!', TALKTYPE_ORANGE_1)
                            end
                        else
                            doCreatureSay(daPet, 'AAh Im out of mana!', TALKTYPE_ORANGE_1)
                        end
                    else
                        doCreatureSay(daPet, 'Woups! I can\'t use that spell yet', TALKTYPE_ORANGE_1)
                    end               
                else
                    ----------------special attacks ?----------------------
                end
            else
                doPlayerSendCancel(cid, 'You must spesific a spell.')
            end
        else
            doPlayerSendCancel(cid, 'You haven\'t call your pet!.')
        end
        return FALSE
    end

!petgetitem.lua

    Kod:
    dofile("./petConfig.lua")


    function onSay(cid, words, param)
        local daPet = getPlayerStorageValue(cid, storages.petUid)
        if isCreature(daPet) == 1 then
            if param ~= "" then
                param = tonumber(param)
                if type(param) == "number" then
                    if param <= maxItems then
                        if getPlayerStorageValue(cid, petItems[param]) ~= 0 and getPlayerStorageValue(cid, petItems[param]) ~= -1 then
                            doPlayerAddItem(cid, getPlayerStorageValue(cid, petItems[getCount(param)]), 1)
                            doCreatureSay(daPet, 'Here is your ' .. getItemName(getPlayerStorageValue(cid, petItems[param])) .. '', TALKTYPE_ORANGE_1)
                            setPlayerStorageValue(cid, petItems[param], 0)
                        end
                    end
                end
            end
        end
    return FALSE
    end

Krok drugi:

Edytujemy plik logout.lua w folderze data\creaturescripts\scripts. Na początku pliku dodajemy:

    Kod:
    dofile("./petConfig.lua")

A w środku pomiędzy funkcją onLogut:

    Kod:
        if isCreature(getPlayerStorageValue(cid, storages.petUid)) == 1 then
            if getPlayerStorageValue(cid, storages.petIsOnline) == 2 then
                setPlayerStorageValue(cid, storages.petIsOnline, 1)
            end
        end

Tak zeby caly plik wygladal tak :

    Kod:
    dofile("./petConfig.lua")

    function onLogout(cid)
        if isCreature(getPlayerStorageValue(cid, storages.petUid)) == 1 then
            if getPlayerStorageValue(cid, storages.petIsOnline) == 2 then
                setPlayerStorageValue(cid, storages.petIsOnline, 1)
            end
        end
        return TRUE
    end

JAK UZYWAC KOMENDY W GRZE:

!petinfo - ta komenda informuje cię o najważniejszych informacjach dotyczących Peta. Możliwe parametry dla komendy
(!petinfo "parametr):

magic level - Pokazuje Mlvl Peta.
mana - Pokazuje Manne Peta.
health - Pokazuje ilość HP Peta.

!petsay - ta komenda pozwala na wyświetlenie mowy Peta.
!petcarry - pozwala na zebranie przez Peta przedmiotu leżącego pod nim.Np.
!pet - tą komenda przywolujemy lub chowamy naszego Peta :
!petattack - tą komendą rozkazujemy Petowi zaatakować wroga:
!petgetitem - tą komendą bierzemy itemy, które wcześniej daliśmy Petowi. Musisz pamietac jakie dales itemy potworkowi ,bo tego nieda sie sprawdzic!.

A tu NPC wskrzeszający naszego Peta:

    Kod:
    local focus = 0
    local talk_start = 0
    local talk_state = 0
    local costPerLevel = 300

    dofile("./petConfig.lua")



    function onThingMove(creature, thing, oldpos, oldstackpos)

    end


    function onCreatureAppear(creature)

    end


    function onCreatureDisappear(cid, pos)
        if focus == cid then
             selfSay('How rude!.')
             focus = 0
             talk_start = 0
        end
    end


    function onCreatureTurn(creature)

    end


    function msgcontains(txt, str)
          return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
    end


    function onCreatureSay(cid, type, msg)
          msg = string.lower(msg)
        if getDistanceToCreature(cid) < 4 then
              if (msgcontains(msg, 'hi') and (focus == 0)) then
                  selfSay('Hello ' .. creatureGetName(cid) .. '! I can take you to the train!')
                    focus = cid
                    talk_start = os.clock()

              elseif msgcontains(msg, 'hi') and (focus ~= cid) then
                  selfSay('Sorry, ' .. creatureGetName(cid) .. '! I talk to you in a minute.')
            end

            if msgcontains(msg, 'revive') and focus == cid then
                if  isCreature(getPlayerStorageValue(cid, storages.petUid)) == 0 then
                    if getPlayerStorageValue(cid, storages.petIsOnline) == 2 then
                        selfSay('YOUR PET DIED?!, YOU\'R A BAD OWNER, THIS WILL COST YOU ' .. getPlayerLevel(cid)*costPerLevel .. ' GOLD COINS!, AGREE?!')
                        talk_state = 1
                    else
                        selfSay('Your pet is alive.')
                    end
                else
                    selfSay('Your pet is standing next to you.')
                end
            talk_start = os.clock()
            end
            if msgcontains(msg, 'yes') and focus == cid and talk_state == 1 then
                if doPlayerRemoveMoney(cid, getPlayerLevel(cid)*costPerLevel) == 1 then
                    setPlayerStorageValue(cid, storages.petIsOnline, 1)
                    selfSay('You can now summon again your pet.')
                else
                    selfSay('You don\'t have enought money.')
                end
            talk_state = 0
            talk_start = os.clock()
            end               

            if msgcontains(msg, 'bye') then
                selfSay('Good bye, ' .. creatureGetName(cid) .. '!')
                focus = 0
                talk_start = 0
                talk_state = 0
            end
        end
    end


    function onCreatureChangeOutfit(creature)

    end


    function onThink()

        doNpcSetCreatureFocus(focus)
          if (os.clock() - talk_start) > 30 then
              if focus > 0 then
                  selfSay('Next Please...')
              end
                  focus = 0
                            talk_state = 0
          end
        if focus ~= 0 then
            if getDistanceToCreature(focus) > 5 then
                            talk_state = 0
                selfSay('Good bye then.')
                            talk_state =  0
                focus = 0
            end
        end
    end

Mam nadzieje ze sie podobalo i komus sie przyda tongue
by lyzwa1991

Offline

 

#2 2009-10-25 22:37:32

Bastet

Użytkownik

Zarejestrowany: 2009-10-25
Posty: 20
Punktów :   

Re: [8.0/8.1] Własny PET!

thx man

Offline

 

Stopka forum

RSS
Powered by PunBB
© Copyright 2002–2008 PunBB
Polityka cookies - Wersja Lo-Fi


Darmowe Forum | Ciekawe Fora | Darmowe Fora
www.zyciekobiet.pun.pl www.bakugan-gundalian-invader.pun.pl www.startmirocin.pun.pl www.nakazdytemat.pun.pl www.discordia-forum.pun.pl