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

TalkAction [Many] My fully lua PET system (MANY FEATURES)

FedeVI

Member
Joined
Nov 3, 2007
Messages
46
Reaction score
7
Location
Chile, south america
ChangeLog:

  • 1.- FIXED 2 ISSUES WITH pet.lua, SO PLEASE UPDATE IT!.
  • 2.- ADDED A CONFIG FILE, AND MAKE IT MORE CONFIGURABLE, YOU MIGHT WANT TO UPDATE IT!.
  • 3.- FIXED SPAMMING ISSUE AND NOW PETS CAN GET ITEMS WITH COUNT (STACKABLES).
  • 4.- ADDED A SPECIAL ATTACK SYSTEM, WITH 3 EXAMPLES; double fire, paralize, and speed.
  • 5.- ADDED PET BY VOCATION, AS REQUESTED ¬¬ AND FIXED MANY TINY ISSUES.
Features:
  • Pet hp and mana depends on your level.
  • You can summon or take out your pet.
  • You can make your pet talk
  • If your pet die, or you die, you need to pay to revive it. It happens JUST if the pet die or you die (not when logout, etc)
  • Pets can use spells, under the control of the owner.
  • Its VERY easy to configurate, and to make new spells, you just need to edit a table ;)
  • Pets DO have magic level, im using the same formula that tibia uses to grow Mlvl (Spells DO have manaSpent)
  • When you summon your pet, it has the same speed that you
  • The damage that have recived the pet, is saved
  • Damage formula depends on pet's magic level, and owner level
  • Pets has exhausted when casting an spell, spells exhausted can be configurated for each spell.
  • Pets talk to tell you whats happening with him
  • Pets DO have mana, and it takes time to recover it, but they don't need food.
  • You can get your pet info
  • Pet can carry items
  • And some more that I might forgot...

<Begin>
Add this into you'r XML talkaction file:
PHP:
<talkaction words="!petinfo" script="pets/!petinfo.lua"/>
<talkaction words="!petsay" script="pets/!petsay.lua"/>
<talkaction words="!petcarry" script="pets/!petcarry.lua"/>
<talkaction words="!pet" script="pets/!pet.lua"/>
<talkaction words="!petattack" script="pets/!petattack.lua"/>
<talkaction words="!petgetitem" script="pets/!petgetitem.lua"/>
Add this to your OTserv folder (where's config.lua):
petConfig.lua:
PHP:
--//                         \\--
--(    made by FedeVI  )  --
--\\____________ //-- 
petSystemExhaustion = 1 --in secods, 0 = no exhausted.  
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 = 4 -- how faster the pet will gain mlvl compared to real tibia,,
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,
			petSystemExhaustion = base+9
			}
			
petItems = {}
maxItems = 10 --Max items the pet can carry
--lol V
x = 0 y = function() x = x + 1 end table.foreach(storages, y)
for i = 1, maxItems do
	petItems[i] = base+x+i
end
--Pets, dependiong on the level
pets = 
	{
		{vocations = {1, 5}, pets =
		{{level = 100, name = "demon"}, {level = 60, name = "Dragons"}, {level = 50, name = "Dwarf Gegmancers"}, {level = 40, name = "Demon Skeleton"}, {level = 30, name = "Fire Devil"}, {level = 20, name = "Minotaur Archer"}, {level = 10, name = "Minotaur"}, {level = 0, name = "Rat"}}
		},
		{vocations = {2, 6}, pets =
		{{level = 100, name = "demon"}, {level = 60, name = "Dragons"}, {level = 50, name = "Dwarf Gegmancers"}, {level = 40, name = "Demon Skeleton"}, {level = 30, name = "Fire Devil"}, {level = 20, name = "Minotaur Archer"}, {level = 10, name = "Minotaur"}, {level = 0, name = "Rat"}}
		},
		{vocations = {3, 7}, pets =
		{{level = 100, name = "demon"}, {level = 60, name = "Dragons"}, {level = 50, name = "Dwarf Gegmancers"}, {level = 40, name = "Demon Skeleton"}, {level = 30, name = "Fire Devil"}, {level = 20, name = "Minotaur Archer"}, {level = 10, name = "Minotaur"}, {level = 0, name = "Rat"}}
		},
		{vocations = {4, 8}, pets =
		{{level = 100, name = "demon"}, {level = 60, name = "Dragons"}, {level = 50, name = "Dwarf Gegmancers"}, {level = 40, name = "Demon Skeleton"}, {level = 30, name = "Fire Devil"}, {level = 20, name = "Minotaur Archer"}, {level = 10, name = "Minotaur"}, {level = 0, name = "Cave 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",  theFunction = false, 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", theFunction = false, 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", theFunction = false, 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", theFunction = false, 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", theFunction = false, 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}
				 },
				 {param = "paralize", needLevel = 1, needMag = 0, manaSpent = 300, exhausted = 2,
				 theFunction = function (parameters)
					daPet = getPlayerStorageValue(parameters.cid, storages.petUid)
					if getCreatureTarget(daPet) ~= 0 then
						doAddCondition(getCreatureTarget(parameters.cid), 4)
					end
				 end
				},
				{param = "speed", needLevel = 10, needMag = 4, manaSpent = 60, exhausted = 2,
				 theFunction = function (parameters)				
					doAddCondition(getPlayerStorageValue(parameters.cid, storages.petUid), 11)
				end
				},
				 {param = "double fire", needLevel = 1, needMag = 0, manaSpent = 100, exhausted = 2,
				 theFunction = function (parameters)

					
					local myAttack = formulaAttack(getPlayerLevel(parameters.cid),  getPlayerStorageValue(parameters.cid, storages.petMag), 0.7, 0, 1.0, 0)
					function doAreaCombatHealthEx(params)
						local randoms = {[1] = math.random(-2, 2),
										 [2] = math.random(-2, 2)				
										}
						
						local attackCreature = getPlayerStorageValue(parameters.cid, storages.petUid)
						if getCreatureTarget(getPlayerStorageValue(parameters.cid, storages.petUid)) ~= 0 then
							attackCreature = getCreatureTarget(getPlayerStorageValue(parameters.cid, storages.petUid))
						end				
						local posa = getCreaturePosition(attackCreature)
						doAreaCombatHealth(getPlayerStorageValue(parameters.cid, storages.petUid), COMBAT_FIREDAMAGE, {x = posa.x + randoms[1], y = posa.y + randoms[2], z = posa.z},  1, -params.myAttack.minD, -params.myAttack.maxD, CONST_ME_FIREAREA)
						doSendDistanceShoot(getCreaturePosition(getPlayerStorageValue(parameters.cid, storages.petUid)), {x = posa.x + randoms[1], y = posa.y + randoms[2], z = posa.z}, CONST_ANI_FIRE)
						
					end
					doAreaCombatHealthEx({cid = parameters.cid, target = getCreaturePosition(attackCreature), myAttack = myAttack})
					for i = 1, 7 do
						addEvent(doAreaCombatHealthEx, 200*i, {cid = parameters.cid, target = getCreaturePosition(attackCreature), myAttack = myAttack})
					end
				end
				}
			}
function setExhausted(cid)
	setPlayerStorageValue(cid, storages.petSystemExhaustion, os.clock()+1)
end
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 isExhausted(cid)
	if isPlayer(cid) == 1 then	
		local CRONOMETRO = getPlayerStorageValue(cid, storages.petSystemExhaustion)
		local CRONOMETRO2 = os.clock()
		local TIEMPO = os.difftime(CRONOMETRO2, CRONOMETRO)
		if petSystemExhaustion - TIEMPO > petSystemExhaustion or CRONOMETRO == -1 then
			setPlayerStorageValue(cid, storages.petSystemExhaustion, CRONOMETRO2+1)
			return 0
		end
		if petSystemExhaustion - TIEMPO <= 0 then
			return 0
		end
	end
return 1
end

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

And now, create a folder in data\talkactions\scripts called pets and add these files (the ones with the "!" prefix):

1.- !petinfo.lua:
PHP:
dofile("./petConfig.lua")
function onSay(cid, words, param)
	if isExhausted(cid) == 1 then
		return 0
	end
	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 setExhausted(cid)
end
2.- !petsay.lua:
PHP:
dofile("./petConfig.lua")
function onSay(cid, words, param)
	if isExhausted(cid) == 1 then
		return 0
	end

	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 setExhausted(cid)
end
 
Last edited:
3.- !petcarry.lua:
PHP:
dofile("./petConfig.lua")
function onSay(cid, words, param)

	if isExhausted(cid) == 1 then
		return 0
	end
	local mySto = 0
	local daPet = getPlayerStorageValue(cid, storages.petUid)
	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, #petItems do
					if getPlayerStorageValue(cid, petItems[b]) == 0 or getPlayerStorageValue(cid, petItems[b]) == -1 then
						mySto = b
						break
					end
				end
				local count = 1
				if mySto ~= 0 then
					local theID = carryingItem.itemid
					if isItemStackable(theID) == 1 then
						count = carryingItem.type
						doRemoveItem(carryingItem.uid, carryingItem.type)
					else
						doRemoveItem(carryingItem.uid, 1)
					end
					setPlayerStorageValue(cid, petItems[mySto], theID*1000+count)
					if count == 1 then
						doCreatureSay(daPet, 'Hmm, a ' .. getItemName(theID) .. ', I\'ll save it on my bag number ' .. mySto .. '!', TALKTYPE_ORANGE_1)
					else
						doCreatureSay(daPet, 'Hmm, ' .. count .. ' ' .. getItemName(theID) .. 's, I\'ll save them on my bag number ' .. mySto .. '!', TALKTYPE_ORANGE_1)
					end
				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 setExhausted(cid)
end
4.- !pet.lua:
PHP:
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 isExhausted(cid) == 1 then
		return 0
	end
	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, #pets do
					if isInArray(pets[i].vocations, getPlayerVocation(cid)) == 1 then
						for k = 1, #pets[i].pets do							
							if pets[i].pets[k].level <= getPlayerLevel(cid) then
								myPet = pets[i].pets[k].name
								break
							end
						end
					break
					end
				end
				myPetUid = doPlayerAddSummon(cid, myPet, getCreaturePosition(cid))
				if myPetUid ~= -1 then
					setPlayerStorageValue(cid, storages.petUid, myPetUid)
					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 setExhausted(cid)
end
 
Last edited:
5.- !petattack.lua
PHP:
dofile("./petConfig.lua")		 
function onSay(cid, words, param)

	if isExhausted(cid) == 1 then
		return 0
	end
	
	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 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)) 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)

			for i = 1, #attacks do
				if param == attacks[i].param then
					myAttack = i
					break
				end
			end

			if myAttack ~= 0 then
				if attacks[myAttack].exhausted - TIEMPO > attacks[myAttack].exhausted or CRONOMETRO == -1 then
					setPlayerStorageValue(cid, storages.petExha, CRONOMETRO2+1)
				end
				if getPlayerStorageValue(cid, storages.petMana) >= attacks[myAttack].manaSpent then
					if attacks[myAttack].needLevel <= getPlayerLevel(cid) then
						if attacks[myAttack].needMag <= getPlayerStorageValue(cid, storages.petMag) then
							if attacks[myAttack].exhausted - TIEMPO <= 0 then
								if attacks[myAttack].theFunction == false 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)
								else
									attacks[myAttack].theFunction({cid = cid, words = words, param = param})
								end
								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*magicLevelRate)
								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, #frases)] .. '!', TALKTYPE_ORANGE_1)
							end
						else
							doCreatureSay(daPet, 'My magic level is too low!', 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 setExhausted(cid)
end

6.- !petgetitem.lua:
PHP:
dofile("./petConfig.lua")
function onSay(cid, words, param)
	if isExhausted(cid) == 1 then
		return 0
	end
	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
						local that = getPlayerStorageValue(cid, petItems[param])
						local item = math.floor(that/1000)
						local count = that-item*1000
						doPlayerAddItem(cid, item, count)
						if count == 1 then
							doCreatureSay(daPet, 'Here is your ' .. getItemName(item) .. '', TALKTYPE_ORANGE_1)
						else
							doCreatureSay(daPet, 'Here are your ' .. count .. ' ' .. getItemName(item) .. 's', TALKTYPE_ORANGE_1)
						end
						setPlayerStorageValue(cid, petItems[param], 0)
					end
				end
			end
		end
	end
return setExhausted(cid)
end
 
Last edited:
And make sure to add this on your logout sctipt
Top:

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

and inside the onLogut:

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

For noobs ¬¬:
PHP:
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



Usage:
1.- !petinfo: this command will let you know the information of your pets. Current params (!peninfo "):
magic level: Magic level of your creature.
mana: Mana of your creature.
health: Health of the creature.
:O I forgot adding creatures items. Will be added leater

2.- !petsay: This command allow you to make you pet talk. For example: !petsay "YOU SUCK MAN!.
xample4qx2.jpg

3.- !petcarry:With this command you can make you pet to carry items. The item should be bellow the pet. Example:
xample1bi5.jpg

4.- !pet: Basiclly, to summon or take out your pet:
xample2ga2.jpg

5.- !petattack: Its used to make your pet attack. You can config the spells editing this table:
PHP:
attacks = {{param = "energy",  theFunction = false, 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", theFunction = false, 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", theFunction = false, 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", theFunction = false, 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", theFunction = false, 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}
				 },
				 {param = "paralize", needLevel = 1, needMag = 0, manaSpent = 300, exhausted = 2,
				 theFunction = function (parameters)
					daPet = getPlayerStorageValue(parameters.cid, storages.petUid)
					if getCreatureTarget(daPet) ~= 0 then
						doAddCondition(getCreatureTarget(parameters.cid), 4)
					end
				 end
				},
				{param = "speed", needLevel = 10, needMag = 4, manaSpent = 60, exhausted = 2,
				 theFunction = function (parameters)				
					doAddCondition(getPlayerStorageValue(parameters.cid, storages.petUid), 11)
				end
				},
				 {param = "double fire", needLevel = 1, needMag = 0, manaSpent = 100, exhausted = 2,
				 theFunction = function (parameters)
					local attackCreature = getPlayerStorageValue(parameters.cid, storages.petUid)
					if getCreatureTarget(getPlayerStorageValue(parameters.cid, storages.petUid)) ~= 0 then
						attackCreature = getCreatureTarget(getPlayerStorageValue(parameters.cid, storages.petUid))
					end
					
					local myAttack = formulaAttack(getPlayerLevel(parameters.cid),  getPlayerStorageValue(parameters.cid, storages.petMag), 0.7, 0, 1.0, 0)
					function doAreaCombatHealthEx(params)
						local randoms = {[1] = math.random(-2, 2),
										 [2] = math.random(-2, 2)				
						}
						

						local posa = getCreaturePosition(attackCreature)
						doAreaCombatHealth(getPlayerStorageValue(parameters.cid, storages.petUid), COMBAT_FIREDAMAGE, {x = posa.x + randoms[1], y = posa.y + randoms[2], z = posa.z},  1, -params.myAttack.minD, -params.myAttack.maxD, CONST_ME_FIREAREA)
						doSendDistanceShoot(getCreaturePosition(getPlayerStorageValue(parameters.cid, storages.petUid)), {x = posa.x + randoms[1], y = posa.y + randoms[2], z = posa.z}, CONST_ANI_FIRE)
						
					end
					doAreaCombatHealthEx({cid = parameters.cid, target = getCreaturePosition(attackCreature), myAttack = myAttack})
					for i = 1, 7 do
						addEvent(doAreaCombatHealthEx, 200*i, {cid = parameters.cid, target = getCreaturePosition(attackCreature), myAttack = myAttack})
					end
				end
				}
			}
You can also make special attacks, editing the field theFunction.

xample5yv9.jpg

6.- !petgetitem: Its used to get your items back, make sure you remember where the pet saved the item!
xample3xy1.jpg

I love making scripts, I dunno why I never publish em's :D.


NPC TO REVIVE PET:

PHP:
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
NOTE: Make sure all monsters are convinceable.
Everything has been tested on TFS 2.10.
Regards, all credits goes to FedeVI.
 
Last edited:
NICE WORK! :) I see that you've put a lot of time into this, and I really thank you for this.
 
Looking good, gonna try this later :)

I'll beta test it for you ;)
 
That script didn't work for TFS, I've fixed it. Here's the fix.

Code:
local focus = 0
local talk_start = 0
local talk_state = 0
local costPerLevel = 300
local base = 2000

local 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
                 }
                 


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 ' .. getCreatureName(cid) .. '! I can take you to the train!')
                focus = cid
                talk_start = os.clock()

          elseif msgcontains(msg, 'hi') and (focus ~= cid) then
              selfSay('Sorry, ' .. getCreatureName(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, ' .. getCreatureName(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
But still, after I've said revive to the NPC and he says:
You can now summon your pet again.
and I use !pet again, I just get a error message in the server console.
[04/02/2008 18:10:25] Lua Script Error: [TalkAction Interface]
[04/02/2008 18:10:25] data/talkactions/scripts/!pet.lua:eek:nSay

[04/02/2008 18:10:25] luaDoSummonCreature(). Can not summon monster: Rat

[04/02/2008 18:10:25] Lua Script Error: [TalkAction Interface]
[04/02/2008 18:10:25] data/talkactions/scripts/!pet.lua:eek:nSay

[04/02/2008 18:10:25] luaDoConvinceCreature(). Creature not found

[04/02/2008 18:10:25] Lua Script Error: [TalkAction Interface]
[04/02/2008 18:10:25] data/talkactions/scripts/!pet.lua:eek:nSay

[04/02/2008 18:10:25] luaGetCreatureBaseSpeed(). Creature not found

[04/02/2008 18:10:25] Lua Script Error: [TalkAction Interface]
[04/02/2008 18:10:25] data/talkactions/scripts/!pet.lua:eek:nSay

[04/02/2008 18:10:25] luaDoChangeSpeed(). Creature not found

[04/02/2008 18:10:25] Lua Script Error: [TalkAction Interface]
[04/02/2008 18:10:25] data/talkactions/scripts/!pet.lua:eek:nSay

[04/02/2008 18:10:25] luaDoCreatureSay(). Creature not found
And I have to revive the pet again... -.^
 
Last edited:
That script didn't work for TFS, I've fixed it. Here's the fix.

Code:
local focus = 0
local talk_start = 0
local talk_state = 0
local costPerLevel = 300
local base = 2000

local 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
                 }
                 


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 ' .. getCreatureName(cid) .. '! I can take you to the train!')
                focus = cid
                talk_start = os.clock()

          elseif msgcontains(msg, 'hi') and (focus ~= cid) then
              selfSay('Sorry, ' .. getCreatureName(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, ' .. getCreatureName(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
But still, after I've said revive to the NPC and he says: and I use !pet again, I just get a error message in the server console. And I have to revive the pet again... -.^

My npc worked on my pc.

Thats because you summoned it on PZ, fixing it now.
 
This is not good :S
I meen the ones that you'll use as pet.
That script didn't work for TFS, I've fixed it. Here's the fix.

Code:
local focus = 0
local talk_start = 0
local talk_state = 0
local costPerLevel = 300
local base = 2000

local 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
                 }
                 


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 ' .. getCreatureName(cid) .. '! I can take you to the train!')
                focus = cid
                talk_start = os.clock()

          elseif msgcontains(msg, 'hi') and (focus ~= cid) then
              selfSay('Sorry, ' .. getCreatureName(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, ' .. getCreatureName(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
But still, after I've said revive to the NPC and he says: and I use !pet again, I just get a error message in the server console. And I have to revive the pet again... -.^

Fixed two issues with pet.lua, replace your old file.

You can now summon your pet again. means that you've revived the pet Lol.
 
I know, but it just bugged after I tried to summon the pet again.. ;P I'll try it now.


EDIT: Everything seems to be working fine now. :) Great work.
 
Last edited:
I haven't got the server online on internet, just a LAN server. To try scripts.

btw, take a look at the post with !petsay.lua ;)
 
Hmm, isn't the pet's HP gonna regenerate?

And also, the !petinfo "magic level" doesn't work. :p
 
Hmm, isn't the pet's HP gonna regenerate?

And also, the !petinfo "magic level" doesn't work. :p
Its !petinfo "magic level xD, you can heal it with spell !petattack "health ,

Edit: !petinfo "magic level works sice the pet has mlvl 1 or more, Ill fix it when I return to come, regards.
 
Last edited:
Back
Top