System zwierzat[chowance][8.1]
Autor Pavlus, on 07-02-2008 12:10
Z powodu braku wiekszych aktualizacji, czy zmian w swiecie OTS postanowilismy udostepnic Wam skrypt, bardzo ciekawy swoja droga, ktory pozwoli Wam na wychowanie wlasnego chowanca.
Mozliwosci:
* HP i mana zwierzecia zalezy od Twojego levelu * Moze w kazdej chwili przywolac lub rozkazac zniknac swojemu summonowi * Moze sprawic, aby Twoj zwierzak przemowil * Jesli Twoj zwierzak zginie, lub Ty zginiesz, bedziesz musial zaplacic zeby mogl znow towarzyszyc 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)
!petinfo.lua:
Spoiler:
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:
Spoiler: 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:
Spoiler: 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[b]) == 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
!pet.lua:
Spoiler: 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.lua
Spoiler: 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:
Spoiler: 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 i zmieniasz funkcje onLogout na:
Spoiler: 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:
Spoiler:
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:
Spoiler: 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.
|