#1 2008-04-20 13:59:48

Armed

http://img262.imageshack.us/img262/9884/adminep0.png

Zarejestrowany: 2008-04-14
Posty: 45
Punktów :   

[8.1] Własny Zwierzak

Armed napisał:

Witam! Prezentuje skrypt na własne zwierzątko. Uwaga skrypt nie jest mój! Zamieszczam go tutaj, ponieważ myślę, że tu będzie dobrze ... ale dość bierzemy się do roboty!

Trochę teorii ....:

Możliwości:

*HP i mana zwierzęcia zależy od Twojego levelu,
*Możesz w każdej chwili przywołać lub rozkazać zniknąć swojemu summonowi,
*Możesz sprawić, aby Twój zwierzak przemówił,
*Jeśli Twój zwierzak zginie, lub Ty zginiesz, będziesz musiał zapłacić żeby mógł znów towarzyszyć Ci w walce,
*Zwierzeta moga uzywac wlasnych czarow, pod kontrola swojego pana,
*Bardzo latwy skrypt do konfiguracji,
*Zwierzeta maja swoj magic level, rosnie on z taka sama szybkoscia jak Tobie,
*Jak zsummonujesz zwierze, ma ono taka sama predkosc jak Ty,
*Obrazenia jakie odnosi zwierzak jest zapisywane,
*Wielkosc obrazen zwierzaka zalezy od jego levelu i magic levelu,
*Zwierzaki maja exhaust taki jaki im ustawisz w konfiguracji,
*Zwierzak powie Ci co sie mu dzieje, jesli traci HP,
*Zwierzaki posiadaja punkty many, odnawiaja sie samoistnie, nie trzeba karmic zwierzecia,
*W kazdej chwili mozesz zobaczyc statystyki swojego pupila,
*Zwierzeta moga przenosic itemy.


Jak to dziala?


!petsay - Twoj zwierzak mowi to, co chcesz:
!petcarry: dodajesz itemke do ekwipunku zwierzecia, itemka musi byc pod zwierzakiem!
!pet: Summonowanie i odsylanie zwierzaka.
!petattack: Twoj pupil atakuje
!petgetitem - poupil oddaje Ci itemke, pamietaj ze bedzie ona pod nim.

Tutorial:

1. Zapisz ten kod jako petConfig.lua w folderze data (przy config.lua)

--// \\--
--( made by FedeVI ) --
--\\____________ //--
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,
petUid = base+1,
petExha = base+2,
petDamage = base+3,
petManaSpent = base+4,
petIsOnline = base+5,
petMana = base+6,
petIsHealing = base+7,
petCap = base+8
}
petItems = {}
maxItems = 10 --Max items the pet can carry
for i = 1, maxItems do
petItems[i] = base+8+i
end
--Pets, dependiong on the level
pets = {{level = 100, name = "demon"},
{level = 60, name = "Dragons"},
{level = 50, name = "Dwarf Geomancers"},
{level = 40, name = "Demon Skeleton"},
{level = 30, name = "Fire Devil"},
{level = 20, name = "Minotaur Archer"},
{level = 10, name = "Minotaur"},
{level = 0, name = "Rat"}
}
--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 = 60, exhausted = 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

2. Zapisz ten kod w folderze data jako !petinfo.lua



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

3. Zapisz ten kod w folderze data jako !petsay.lua



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

4. Zapisz ten kod w folderze data jako !petcarry.lua

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]5. Zapisz ten kod w folderze data jako !pet.lua


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

5. Zapisz ten kod w folderze data jako !petattack.lua

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

6. Zapisz ten kod w folderze data jako !petgetitem.lua:

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[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

Teraz otwierasz scrypt odpowiedzialny za wylogowanie gracza

logout.lua w folderze data\creaturescripts\scripts

i zmieniasz funkcje onLogout na:




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


Edytowanie atakow zwierzecia - edytowanie tej tabeli w pliku petconf.lua



local attacks = {{param = "energy", offensive = 1, needLevel = 20, self = 0, needMag = 10, manaSpent = 60, exhausted = 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}

}

}

Teraz plik NPC ktory pozwoli na odzyskanie zwierzecia:

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

Pamietajcie ze wszystkie rodzaje potworow, ktore chcecie aby byly dostepne jako zwierzeta (chowance) musza byc umozliwione do summonowania przez graczy.


JEŻELI POMOGŁEM DAJ PLUSA ;D
PROSZE O KOMENTARZE

Offline

 

#2 2008-05-08 20:33:59

szczygus

http://i12.tinypic.com/8gjenv9.png

Zarejestrowany: 2008-04-19
Posty: 20
Punktów :   

Re: [8.1] Własny Zwierzak

ale do czego to ma służyc?

Offline

 

#3 2008-05-10 17:30:39

Armed

http://img262.imageshack.us/img262/9884/adminep0.png

Zarejestrowany: 2008-04-14
Posty: 45
Punktów :   

Re: [8.1] Własny Zwierzak

No ze masz potworka który ci pomaga

Offline

 

#4 2009-08-30 18:24:07

Bulu

http://i7.tinypic.com/6s6xvmt.png

Zarejestrowany: 2009-08-30
Posty: 3
Punktów :   

Re: [8.1] Własny Zwierzak

Dobra rzecz :d napewno sie przyda

Thx Pozdro Bulu

Offline

 

Stopka forum

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


Darmowe Forum | Ciekawe Fora | Darmowe Fora
retractable gates into the ground piosenka o pisance wielkanocnej