Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Testado nas versões 8.60 - 9.43.

Na pasta data/lib/pets.lua:


--Circles

AREA_CIRCLE2X2 =

{

   {0, 1, 1, 1, 0},

   {1, 1, 1, 1, 1},

   {1, 1, 3, 1, 1},

   {1, 1, 1, 1, 1},

   {0, 1, 1, 1, 0}

}


AREA_CIRCLE3X3 =

{

   {0, 0, 1, 1, 1, 0, 0},

   {0, 1, 1, 1, 1, 1, 0},

   {1, 1, 1, 1, 1, 1, 1},

   {1, 1, 1, 3, 1, 1, 1},

   {1, 1, 1, 1, 1, 1, 1},

   {0, 1, 1, 1, 1, 1, 0},

   {0, 0, 1, 1, 1, 0, 0}

}


-- Crosses

AREA_CROSS1X1 =

{

   {0, 1, 0},

   {1, 3, 1},

   {0, 1, 0}

}


AREA_CROSS5X5 =

{

   {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

   {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

   {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},

   {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},

   {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},

   {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1},

   {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},

   {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},

   {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},

   {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},

   {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}

}


AREA_CROSS6X6 =

{

   {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},

   {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},

   {0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0},

   {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0},

   {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},

   {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},

   {1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1},

   {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},

   {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},

   {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0},

   {0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0},

   {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},

   {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}

}


--Squares

AREA_SQUARE1X1 =

{

   {1, 1, 1},

   {1, 3, 1},

   {1, 1, 1}

}


-- Walls

AREA_WALLFIELD = {

   {1, 1, 3, 1, 1}

}


AREADIAGONAL_WALLFIELD =

{

   {0, 0, 0, 0, 1},

   {0, 0, 0, 1, 1},

   {0, 1, 3, 1, 0},

   {1, 1, 0, 0, 0},

   {1, 0, 0, 0, 0},

}


TYPE_NEAR = 1

TYPE_DISTANCE = 2


petExhaust = 3 --in seconds

petSayExhaust = 3 --in seconds


petGainTicks =

{

   health = {func = doCreatureAddHealth, time = 3000, count = 1},

   mana = {func = doCreatureAddMana, time = 3000, count = 2}

}


petGainHealth = 30

petGainMana = 30

petExpRate = 1.3


carryItems = 10


petItemsBase = 1250

petItems = {}

blockedItems = {6132, 2195}


for i = 1, carryItems do

   table.insert(petItems, petItemsBase + i)

end


petBase = 61200

petStorages =

{

   pet = petBase + 1,

   level = petBase + 2,

   exp = petBase + 3,

   items = petBase + 4,

   isPet = petBase + 5,

   isDead = petBase + 6,

   exhaust = petBase + 7,

   sayExhaust = petBase + 8,

   moveExhaust = petBase + 9,

   health = petBase + 10,

   mana = petBase + 11

}


reviveCost = 1000


pets =

{

   [1] =

   {

	  monster = "orc spearman",

	  vocations = {1, 2, 3, 4},

	  level = 30,

	  attacks =

	  {

		 [1] = {name = "", level = 30, petLevel = 30, mana = 50, type = TYPE_DISTANCE, range = 10, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_NONE, distEffect = CONST_ANI_SPEAR, damageMin = 0.7, damageMax = 1.0}

	  }

   },

   [2] =

   {

	  monster = "fire devil",

	  vocations = {1, 2},

	  level = 60,

	  attacks =

	  {

		 [1] = {name = "Fire Strike", level = 60, petLevel = 60, mana = 100, type = TYPE_DISTANCE, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREDAMAGE, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.0}

	  }

   },

   [3] =

   {

	  monster = "minotaur guard",

	  vocations = {3, 4},

	  level = 60,

	  attacks =

	  {

		 [1] = {name = "Punch", level = 60, petLevel = 60, mana = 55, type = TYPE_NEAR, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOOD, distEffect = CONST_ANI_NONE, damageMin = 1.5, damageMax = 2.0}

	  }

   },

   [4] =

   {

	  monster = "water elemental",

	  vocations = {2},

	  level = 95,

	  attacks =

	  {

		 [1] = {name = "Ice Bomb", level = 100, petLevel = 100, mana = 250, type = TYPE_DISTANCE, range = 3, combat = COMBAT_ICEDAMAGE, effect = CONST_ME_ICEAREA, distEffect = CONST_ANI_ICE, damageMin = 1.5, damageMax = 2.0, area = {{0, 0, 1, 0, 0}, {0, 1, 3, 1, 0}, {0, 0, 1, 0, 0}}},

		 [2] = {name = "Poison Strike", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, range = 8, combat = COMBAT_EARTHDAMAGE, effect = CONST_ME_GREENRINGS, distEffect = CONST_ANI_POISON, damageMin = 1.2, damageMax = 1.8}  

	  }

   },

   [5] =

   {

	  monster = "fire elemental",

	  vocations = {1},

	  level = 95,

	  attacks =

	  {

		 [1] = {name = "Fire Bomb", level = 100, petLevel = 100, mana = 250, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREDAMAGE, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.0, area = {{0, 0, 1, 0, 0}, {0, 1, 3, 1, 0}, {0, 0, 1, 0, 0}}},

		 [2] = {name = "Fire Strike", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREDAMAGE, distEffect = CONST_ANI_FIRE, damageMin = 1.2, damageMax = 1.8}  

	  }

   },

   [6] =

   {

	  monster = "orc warlord",

	  vocations = {4},

	  level = 95,

	  attacks =

	  {

		 [1] = {name = "Throw Knife", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOOD, distEffect = CONST_ANI_THROWINGKNIFE, damageMin = 1.5, damageMax = 2.0}

	  }

   },

   [7] =

   {

	  monster = "golem",

	  vocations = {3},

	  level = 95,

	  attacks =

	  {

		 [1] = {name = "Throw Stone", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOOD, distEffect = CONST_ANI_LARGEROCK, damageMin = 1.5, damageMax = 2.0}

	  }

   },

   [8] =

   {

	  monster = "wyrm",

	  vocations = {1, 2, 3, 4},

	  level = 135

   },

   [9] =

   {

	  monster = "dragon lord",

	  vocations = {1, 2, 3, 4},

	  level = 200,

	  attacks =

	  {

		 [1] = {name = "Fire Bomb", level = 200, petLevel = 200, mana = 300, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.0, area = AREA_CROSS1X1},

		 [2] = {name = "Fire Storm", level = 205, petLevel = 220, mana = 700, type = TYPE_NEAR, range = 8, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.8, damageMax = 2.5, area = AREA_CROSS5X5},

		 [3] = {name = "Fire Explosion", level = 203, petLevel = 210, mana = 450, type = TYPE_DISTANCE, range = 6, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_EXPLOSIONHIT, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.1, area = AREA_CIRCLE2X2},

		 [4] = {name = "Scratch", level = 201, petLevel = 205, mana = 150, type = TYPE_NEAR, range = 1, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_HITAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.3, damageMax = 1.8},

		 [5] = {name = "Fire Strike", level = 203, petLevel = 210, mana = 100, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_EXPLOSIONAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.8, damageMax = 1.9}  

	  }

   }

}


function gainStat(pid, stat)


   if pid and pid > 0 and isMonster(pid) then

	  stat.func(pid, stat.count)

   end

   addEvent(gainStat, stat.time, pid, stat)

end


function getLevelByExp(exp)

    return math.floor((math.sqrt(3) * math.sqrt(243*(exp+1)^2-48600*(exp+1)+3680000)+27 * (exp+1)-2700)^(1/3)/30^(2/3)-(5*10^(2/3))/(3^(1/3)*(math.sqrt(3)*math.sqrt(243*(exp+1)^2-48600*(exp+1)+3680000)+27*(exp+1)-2700)^(1/3))+2)

end


function getPetInfo(pet)

   if isNumber(pet) then

	  return pets[pet] or false

   else

	  for _, v in pairs(pets) do

		 if pet:lower() == v.monster then

		    return v

		 end

	  end

   end

   return false

end


function getPetByLevel(cid)

   local level = getPlayerLevel(cid)

   local pet

   for i = 1, #pets do

	  v = pets[i]

	  if level >= v.level and isInArray(v.vocations, getPlayerVocation(cid)) then

		 pet = v

	  end

   end

   return (pet ~= nil and pet or false)

end


function getAttackFormula(pid, attack)

    return {

		 min = ((getPetLevel(pid) * 2) * (1 + attack.damageMin) + getPetLevel(pid)) / 2.5,

		 max = ((getPetLevel(pid) * 3) * (1 + attack.damageMax) + getPetLevel(pid)) / 2.5

		  }

end


function doAttack(pid, target, param)


   local pet = getPetInfo(getCreatureName(pid))

   if pet then

	  if pet.attacks and pet.attacks[param] then

		 local attack = pet.attacks[param]

		 if target > 0 and attack.type and attack.type == TYPE_DISTANCE and getDistanceBetween(getCreaturePosition(pid), getCreaturePosition(target)) > (attack.range or 3) or attack.type == TYPE_NEAR and target > 0 and getDistanceBetween(getCreaturePosition(pid), getCreaturePosition(target)) > attack.range then

		    return doPlayerSendCancel(getCreatureMaster(pid), "Target is too far.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)

		 end

		 if target > 0 and not isSightClear(getCreaturePosition(pid), getCreaturePosition(target), true) then

		    return doPlayerSendCancel(getCreatureMaster(pid), "There is not enough room.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)

		 end

		 if target == 0 then

		    return doPlayerSendCancel(getCreatureMaster(pid), "Please select a target first.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)

		 end

		 if getPlayerLevel(getCreatureMaster(pid)) < attack.level then

		    return doPlayerSendCancel(getCreatureMaster(pid), "You need level " .. attack.level .. " or higher to use this attack.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)

		 end

		 if getPetLevel(pid) < attack.petLevel then

		    return doPlayerSendCancel(getCreatureMaster(pid), "Your pet needs level " .. attack.petLevel .. " or higher to use this attack.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)

		 end

		 if attack.mana and getCreatureMana(pid) < attack.mana then

		    return doPlayerSendCancel(getCreatureMaster(pid), "Your pet does not have enough mana.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)

		 end

		 if attack.area then

		    doCastAreaAttack(pid, target, attack.area, attack)

		 else

		    doTargetCombatHealth(pid, target, attack.combat, -getAttackFormula(pid, attack).min, -getAttackFormula(pid, attack).max, attack.effect)

		 end

		 doCreatureAddMana(pid, -attack.mana)

		 return doSendDistanceShoot(getCreaturePosition(pid), (attack.type == TYPE_DISTANCE and getCreaturePosition(target) or getCreaturePosition(pid)), attack.distEffect) and doCreatureSay(pid, attack.name, TALKTYPE_MONSTER)

	  else

		 return doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)

	  end

   else

	  return doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF) and doPlayerSendCancel(getCreatureMaster(pid), "There is a tecnical problem, please contact a gamemaster.")

   end

end


function callPet(cid)


   for i = 1, #petStorages do

	  if getCreatureStorage(cid, petStorages[i]) < 0 then

		 doCreatureSetStorage(cid, petStorages[i], 0)

	  end

   end


   local pet = getPetByLevel(cid)

   if not pet then

	  return doPlayerSendCancel(cid, "You do not have enough level to call a pet.")

   end


   local ret = doCreateMonster(pet.monster, getCreaturePosition(cid))


   if getCreatureStorage(cid, petStorages.level) < 1 then

	  doCreatureSetStorage(cid, petStorages.level, pet.level)

   end


   if getCreatureStorage(cid, petStorages.exp) < 1 then

	  doCreatureSetStorage(cid, petStorages.exp, getExperienceForLevel(pet.level))

   end


   if getCreatureStorage(cid, petStorages.level) < pet.level then

	  doCreatureSetStorage(cid, petStorages.level, pet.level)

   elseif getPlayerLevel(cid) * 3 < getCreatureStorage(cid, petStorages.level) then

	  doCreatureSetStorage(cid, petStorages.level, (getPetByLevel(cid).level or 0))

	  doCreatureSetStorage(cid, petStorages.exp, getExperienceForLevel((getPetByLevel(cid).level or 0)))

   end


   if getLevelByExp(getCreatureStorage(cid, petStorages.exp)) < getCreatureStorage(cid, petStorages.level) then

	  doCreatureSetStorage(cid, petStorages.exp, getExperienceForLevel(getCreatureStorage(cid, petStorages.level)))

   end


   if getCreatureStorage(cid, petStorages.health) < 1 then

	  doCreatureSetStorage(cid, petStorages.health, getCreatureStorage(cid, petStorages.level) * petGainHealth)

   end


   if getCreatureStorage(cid, petStorages.mana) < 1 then

	  doCreatureSetStorage(cid, petStorages.mana, getCreatureStorage(cid, petStorages.level) * petGainMana)

   end


   doCreatureSetStorage(ret, petStorages.level, getCreatureStorage(cid, petStorages.level))

   doCreatureSetStorage(ret, petStorages.exp, getCreatureStorage(cid, petStorages.exp))


   doConvinceCreature(cid, ret)

   doCreatureSetStorage(ret, petStorages.isPet, 1)

   doSendMagicEffect(getCreaturePosition(ret), CONST_ME_TELEPORT)

   setCreatureMaxHealth(ret, getPetLevel(ret) * petGainHealth)

   doCreatureAddHealth(ret, -getCreatureHealth(ret) + getCreatureStorage(cid, petStorages.health))

   setCreatureMaxMana(ret, getPetLevel(ret) * petGainMana)

   doCreatureAddMana(ret, -getCreatureMana(ret) + getCreatureStorage(cid, petStorages.mana))

   for _, v in pairs(petGainTicks) do

	  gainStat(ret, v)

   end

   return doCreatureSay(cid, "Go pet!", TALKTYPE_SAY)

end


function doCastAreaAttack(pid, target, area, attack)

   local center = {}

   local areaxx = {}

   center.y = math.floor(#area/2)+1

   for y = 1, #area do

	  for x = 1, #area[y] do

		 local number = area[y][x]

		 if number > 0 then

		    center.x = math.floor(table.getn(area[y])/2)+1

		    if attack.type == TYPE_DISTANCE then

			   table.insert(areaxx, {x = getCreaturePosition(target).x + x - center.x, y = getCreaturePosition(target).y + y - center.y, z = getCreaturePosition(target).z})

		    else

			   table.insert(areaxx, {x = getCreaturePosition(pid).x + x - center.x, y = getCreaturePosition(pid).y + y - center.y, z = getCreaturePosition(pid).z})

		    end		   

		 end

	  end

   end

   for i = 1, #areaxx do

	  doAreaCombatHealth(pid, attack.combat, areaxx[i], 0, -getAttackFormula(pid, attack).min, -getAttackFormula(pid, attack).max, attack.effect)

   end

end


function isPet(pid)

   return getCreatureStorage(pid, petStorages.isPet) > 0 and true or false

end


function doPetAddExperience(pid, exp)


   doCreatureSetStorage(pid, petStorages.exp, getCreatureStorage(pid, petStorages.exp) + exp)

   doCreatureSetStorage(getCreatureMaster(pid), petStorages.exp, getPetExperience(pid))

   doSendAnimatedText(getCreaturePosition(pid), exp, getConfigValue("gainExperienceColor"))

   return true

end


function getPetExperience(pid)

   return getCreatureStorage(pid, petStorages.exp)

end


function getPetLevel(pid)

   return getCreatureStorage(pid, petStorages.level)

end


function doPetSetLevel(pid, level)


   doCreatureSetStorage(pid, petStorages.level, level)

   doCreatureSetStorage(getCreatureMaster(pid), petStorages.level, level)

   setCreatureMaxHealth(pid, getPetLevel(pid) * petGainHealth)

   setCreatureMaxMana(pid, getPetLevel(pid) * petGainMana)

   return true

end


function getPlayerPet(cid)

   local pet

   if #getCreatureSummons(cid) < 1 then

	  pet = false

   end


   for _, it in ipairs(getCreatureSummons(cid)) do

	  if isPet(it) then

		 pet = it

		 break

	  end

   end

   return pet

end


function getTopItem(p)

   p.stackpos = 0

   local v = getThingFromPos(p)

   repeat

	  p.stackpos = p.stackpos + 1

	  v = getThingFromPos(p)

   until v.itemid == 0

   p.stackpos = p.stackpos - 1

   return getThingFromPos(p)

end

Pasta data/creaturescripts/scripts/petdeath.lua:

function onDeath(cid, corpse, deathList)


   if not isMonster(cid) or not isPet(cid) then return true end


   doCreatureSetStorage(getCreatureMaster(cid), petStorages.isDead, 1)

   doPlayerSendTextMessage(getCreatureMaster(cid), MESSAGE_STATUS_CONSOLE_BLUE, "Your pet is dead.")

   return true

end

Pasta data/creaturescripts/scripts/petstats.lua:

function onStatsChange(cid, attacker, type, combat, value)


   if getPlayerPet(cid) and getPlayerPet(cid) == attacker then

	  return false

   end

   return true

end

Pasta data/creaturescripts/scripts/petkill.lua:

function onKill(cid, target, lastHit)


   if not isMonster(target) or getConfigValue("rateExperience") < 0.1 or getMonsterInfo(getCreatureName(target)) and getMonsterInfo(getCreatureName(target)).experience < 1 then return true end


   local pet = getPlayerPet(cid)

   if pet then

	  doPetAddExperience(pet, getMonsterInfo(getCreatureName(target)).experience * petExpRate)

	  if getLevelByExp(getPetExperience(pet)) > getPetLevel(pet) then

		 doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Your pet advanced from level " .. getPetLevel(pet) .. " to level " .. getLevelByExp(getPetExperience(pet)) .. ".")

		 doPetSetLevel(pet, getLevelByExp(getPetExperience(pet)))

	  end

   end

   return true

end

Adicione no data/creaturescripts/scripts/login.lua:

registerCreatureEvent(cid, "petKill")

   registerCreatureEvent(cid, "petDeath")

   registerCreatureEvent(cid, "petSta")

Adicione na data/creaturescripts/creaturescripts.xml:

<event type="kill" name="petKill" event="script" value="petkill.lua"/>

   <event type="death" name="petDeath" event="script" value="petdeath.lua"/>

   <event type="statschange" name="petStats" event="script" value="petstats.lua"/>

Na pasta talkactions/scripts/pet.lua:

local l =

{

   ["north"] = NORTH,

   ["east"] = EAST,

   ["south"] = SOUTH,

   ["west"] = WEST,

   ["southwest"] = SOUTHWEST,

   ["southeast"] = SOUTHEAST,

   ["northwest"] = NORTHWEST,

   ["northeast"] = NORTHEAST

}

--fixed by falcon--

function onSay(cid, words, param, channel)

   if(param == '') then

	  doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.")

	  return true

   end


   if param:lower() == "call" then

	  if getCreatureStorage(cid, petStorages.isDead) > 0 then

		 return doPlayerSendCancel(cid, "You need to revive your pet first.")

	  end

	  if getTilePzInfo(getCreaturePosition(cid)) then

		 return doPlayerSendCancel(cid, "You cannot call your pet in protection zone.")

	  end

	  local pet = getPlayerPet(cid)

	  if not pet then

		 return callPet(cid)

	  else

		 doCreatureSetStorage(cid, petStorages.health, getCreatureHealth(pet))

		 doCreatureSetStorage(cid, petStorages.mana, getCreatureMana(pet))  

		 doSendMagicEffect(getCreaturePosition(pet), CONST_ME_POFF)

		 doRemoveCreature(pet)

		 return doCreatureSay(cid, "It's enough!", TALKTYPE_SAY)

	  end

   elseif param:lower() == "info" then

	  local pet = getPlayerPet(cid)

	  if pet then

		 local pet_ = getPetInfo(getCreatureName(pet))

		 local attacks = ""

		 if pet_.attacks and #pet_.attacks > 0 then

		    for i = 1, #pet_.attacks do

			   attacks = attacks .. "Attack ID: " .. i .. "\n" .. (pet_.attacks[i].name ~= "" and "    Name: " .. pet_.attacks[i].name .. "\n" or "") .. "    Level: " .. pet_.attacks[i].level .. "\n    Pet level: " .. pet_.attacks[i].petLevel .. "\n    Pet mana: " .. pet_.attacks[i].mana .. "\n"

		    end

		 end

		 return doShowTextDialog(cid, 1948, "Here is your pet info:\n" ..

		    "\nName: " .. getCreatureName(pet) ..

		    "\nHealth: " .. getCreatureHealth(pet) .. "-" .. getCreatureMaxHealth(pet) ..

		    "\nMana: " .. getCreatureMana(pet) .. "-" .. getCreatureMaxMana(pet) ..

		    "\nLevel: " .. getPetLevel(pet) ..

		    "\nExperience: " .. getPetExperience(pet) ..

		    "\n-----Attacks-----\n" .. (attacks ~= "" and attacks or "No attacks"))

	  else

		 return doPlayerSendCancel(cid, "Please call your pet first.")

	  end

   elseif param:lower() == "take" then

	  local pet = getPlayerPet(cid)

	  if not pet then

		 return doPlayerSendCancel(cid, "Please call your pet first.")

	  end


	  local slot = 0

	  for i = 1, carryItems do

		 if getCreatureStorage(cid, petItems[i]) < 1 then

		    slot = i

		    break

		 end

	  end


	  if slot == 0 then

		 return doPlayerSendCancel(cid, "You only can carry " .. carryItems .. " items.")

	  end


	  local item = getTopItem(getCreaturePosition(pet))

	  if getItemWeightById(item.itemid, 1) and getItemWeightById(item.itemid, 1) < 1 then

		 return doPlayerSendCancel(cid, "There is no item to carry.")

	  end


	  if isInArray(blockedItems, item.itemid) then

		 return doPlayerSendCancel(cid, "You cannot carry this item.")

	  end

	  doCreatureSetStorage(cid, petItems[slot], item.itemid * 1000 + (item.type > 0 and item.type or 1))

	  doRemoveItem(item.uid)

	  doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You take an item.")

	  return true

   elseif param:lower() == "items" then

	  local list = "Here is the list of items:\n"

	  for i = 1, carryItems do

		 if getCreatureStorage(cid, petItems[i]) < 1 then

		    list = list .. "\n" .. i .. ". Empty."

		 else

		    local thing = getCreatureStorage(cid, petItems[i])

		    local item = math.floor(thing / 1000)

		    local count = thing - item * 1000

		    list = list .. "\n" .. i .. ". x" .. count .. " " .. getItemNameById(item) .. "."

		 end

	  end


	  return doShowTextDialog(cid, 1948, list)

   else

	  param = string.explode(param, ":")

	  if param[1]:lower() == "attack" then

		 local pet = getPlayerPet(cid)

		 if not pet then

		    return doPlayerSendCancel(cid, "Please call your pet first.")

		 end

		 if not param[2] or not isNumber(param[2]) or tonumber(param[2]) < 1 then

		    return doPlayerSendCancel(cid, "No attack index specified.")

		 end


		 if exhaustion.get(cid, petStorages.exhaust) then

		    return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF)

		 end


		 doAttack(pet, getCreatureTarget(cid), tonumber(param[2]))

		 exhaustion.set(cid, petStorages.exhaust, petExhaust)

	  elseif param[1]:lower() == "give" then

		 local pet = getPlayerPet(cid)

		 if not pet then

		    return doPlayerSendCancel(cid, "Please call your pet first.")

		 end

		 if not param[2] or not isNumber(param[2]) or tonumber(param[2]) < 1 then

		    return doPlayerSendCancel(cid, "No slot specified.")

		 end


		 if getCreatureStorage(cid, petItems[tonumber(param[2])]) > 0 then

		    local thing = getCreatureStorage(cid, petItems[tonumber(param[2])])

		    local item = math.floor(thing/1000)

		    local count = thing-item*1000

		    doPlayerAddItem(cid, item, count)

		    doCreatureSetStorage(cid, petItems[tonumber(param[2])], 0)

		    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You get an item.")

		 else

		    return doPlayerSendCancel(cid, "This slot is empty.")

		 end

	  elseif param[1]:lower() == "say" then

		 local pet = getPlayerPet(cid)

		 if not pet then

		    return doPlayerSendCancel(cid, "Please call your pet first.")

		 end

		 if not param[2] or param[2] == "" then

		    return doPlayerSendCancel(cid, "Command param required.")

		 end


		 if exhaustion.get(cid, petStorages.sayExhaust) then

		    return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF)

		 end


		 doCreatureSay(pet, param[2], TALKTYPE_MONSTER)

		 exhaustion.set(cid, petStorages.sayExhaust, petExhaust)

	  elseif param[1]:lower() == "move" then

		 local pet = getPlayerPet(cid)

		 if not pet then

		    return doPlayerSendCancel(cid, "Please call your pet first.")

		 end

		 if not param[2] or param[2] == "" then

		    return doPlayerSendCancel(cid, "Command param required.")

		 end


		 if exhaustion.get(cid, petStorages.moveExhaust) then

		    return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF)

		 end


		 local dir

		 if l[param[2]:lower()] then

		    dir = l[param[2]:lower()]

		    local toPos = getPosByDir(getCreaturePosition(pet), dir, 1)

		    local ret = queryTileAddThing(pet, toPos)

		    if ret == RETURNVALUE_NOERROR then

			   doMoveCreature(pet, dir)

			   exhaustion.set(cid, petStorages.moveExhaust, petExhaust)

		    else

			   return doPlayerSendCancel(cid, "There is not enough room.") and doSendMagicEffect(getCreaturePosition(pet), CONST_ME_POFF)

		    end

		 else

		    return doPlayerSendCancel(cid, "No direction specified.")

		 end

	  elseif isInArray({"mana", "health"}, param[1]:lower()) then

		 if getPlayerGroupId(cid) < 3 then

		    return false

		 end

		 local pet = getPlayerPet(cid)

		 if not pet then

		    return doPlayerSendCancel(cid, "Please call your pet first.")

		 end

		 if not param[2] or not isNumber(param[2]) then

		    return doPlayerSendCancel(cid, "Command param required.")

		 end


		 if param[1]:lower() == "health" then

		    doCreatureAddHealth(pet, tonumber(param[2]))

		 elseif param[1]:lower() == "mana" then

		    doCreatureAddMana(pet, tonumber(param[2]))

		 end

		 return doSendMagicEffect(getCreaturePosition(pet), (param[1]:lower() == "health" and CONST_ME_MAGIC_RED or CONST_ME_MAGIC_BLUE))

	  end

   end

   return true

end

Talkactions.xml:

<talkaction words="!pet" event="script" value="pet.lua"/>

Screen's: xksw45.pngauunhf.png2nqu139.pngComandos:
!pet call

!pet take

!pet items

!pet attack

!pet give

!pet say

!pet move

!pet mana

Créditos:

Falcon

x1fCxnI.png

Link para o post
Compartilhar em outros sites

Curti cara, sempre gostei desses Pet System D:. Obrigado por trazer o conteúdo ao fórum.

-"Supra Omnes Lux Lucis"

- Acima de todos brilha a Luz -

5VGnDyBz.png

Link para o post
Compartilhar em outros sites

Rep+ por ter trazido para o fórum, se alguém testar e aprovar eu dou outro rep.

Skype @kaiquegabriel__ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Atenciosamente,

kaiquegabriel.

Não dou suporte via pm.

Em caso de dúvidas, crie um tópico e espere o suporte.

Link para o post
Compartilhar em outros sites

1 Pow quando sumono o pet ele me ataca ; como tiro ?

2 tem como colocar pro pet se teleportar pra perto do player depois de uma certa distancia?

Link para o post
Compartilhar em outros sites

1 Pow quando sumono o pet ele me ataca ; como tiro ?

2 tem como colocar pro pet se teleportar pra perto do player depois de uma certa distancia?

Você tem que modificar o xml do monstro, modificar onde estiver assim:



<flag convinceable="1"/>

Deixar assim:

<flag convinceable="0"/>

-"Supra Omnes Lux Lucis"

- Acima de todos brilha a Luz -

5VGnDyBz.png

Link para o post
Compartilhar em outros sites
  • 3 years later...
  • 8 months later...

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por Fausto32
      Script/Tutorial+ Php +Map +Talkaction +Portal.
      Ps: Antes de falar q o topico já existe no forum teste os outros scripts
      Então começando por informações basícas :
      Para abrir o evento : /zombiestart numero de players . exemplo : /zombiestart 2
      Para Iniciar o evento sem o numero maximo de players: /zombiestart force.
      Apos aberto sempre q um player ente no portal do evento e avisado por broadcast quem
      entrou na arena e o numero de players restantes para o evento ser iniciado.
      Apos o evento ser iniciado um zombie e sumonado a cada 20 segundos, o player que for infectado e teleportado para o templo vence o ultimo player restante na arena.
      Ao terminar o evento e anuciado por broadcast o nome do player vencedor tempo q durou na arena e por quantos zombies ele sobreviveu, entrega de premio automatica, premio configuravel.
      Garantia de funcionabilidade perfeita em TFS 0.4 se configurado corretamente, não testado em outras versões de distros.
      Creditos: Me .. não criei mais montei peguei de varios servers/topicos e corigi os varios bugs de distro colocaria os creditos de onde peguei a maioria do script mais foi de um server sem creditos q nem era pra ter sido postado.
      Enfim Vamos ao Evento !
      Primeiro vou estar postando a pagina classica do Zombie event no Gesior que seria a parte PHP para informar os players sobre o evento.
      Pagina PHP + Tutorial de como implementar ela no seu site.
      Agora alguns mapas para o zombie event:
      Então Agora vamos ao script !
      data\creaturescripts\scripts\zombie – A pasta ‘zombie’ deve ser criada no diretorio citado.
      \data\creaturescripts\scripts\Zombie\onattack.lua
        function loseOnZombieArena(cid) kickPlayerFromZombiesArea(cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "BOOM! You are dead.") local players = getZombiesEventPlayers() if(#players <= 1) then local winner = players[1] if(winner) then doPlayerAddItem(winner, 2157, 5, true) doPlayerAddItem(winner, 6119, 1, true) doPlayerSendTextMessage(winner, MESSAGE_STATUS_CONSOLE_BLUE, "You won zombies arena event.") doBroadcastMessage("After " .. os.time() - getPlayerZombiesEventStatus(winner) .. " seconds of fight " .. getCreatureName(winner) .. " won Zombie Arena Event in game versus " .. getStorage(ZE_ZOMBIES_SPAWNED) .. " zombies!") kickPlayerFromZombiesArea(winner) else doBroadcastMessage("Zombie arena event finished! No one win?!?!?! WTF!") end doSetStorage(ZE_STATUS, 0) doSetStorage(ZE_PLAYERS_NUMBER, ZE_DEFAULT_NUMBER_OF_PLAYERS) doSetStorage(ZE_ZOMBIES_TO_SPAWN, 0) doSetStorage(ZE_ZOMBIES_SPAWNED, 0) local width = (math.max(ZE_spawnFromPosition.x, ZE_spawnToPosition.x) - math.min(ZE_spawnFromPosition.x, ZE_spawnToPosition.x)) / 2 + 1 local height = (math.max(ZE_spawnFromPosition.y, ZE_spawnToPosition.y) - math.min(ZE_spawnFromPosition.y, ZE_spawnToPosition.y)) / 2 + 1 local centerPos = {x=math.min(ZE_spawnFromPosition.x, ZE_spawnToPosition.x)+width,y=math.min(ZE_spawnFromPosition.y, ZE_spawnToPosition.y)+height,z=ZE_spawnFromPosition.z} for z = math.min(ZE_spawnFromPosition.z, ZE_spawnToPosition.z), math.max(ZE_spawnFromPosition.z, ZE_spawnToPosition.z) do centerPos.z = z for i, uid in pairs(getSpectators(centerPos, width, height, false)) do if(isMonster(uid)) then doRemoveCreature(uid) end end end end end function onStatsChange(target, cid, changetype, combat, value) if((cid and isMonster(cid) and getCreatureName(cid) == "Zombie Event") or (isInRange(getThingPosition(target), ZE_spawnFromPosition, ZE_spawnToPosition) and changetype == STATSCHANGE_HEALTHLOSS and math.abs(value) >= getCreatureHealth(target))) then doCreatureAddHealth(target, getCreatureMaxHealth(target)) loseOnZombieArena(target) return false end return true end \data\creaturescripts\scripts\Zombie\ondeath.lua
        function onDeath(cid) setZombiesToSpawnCount(getZombiesToSpawnCount() + 2) doCreatureSay(cid, "I'll be back!", 19) return true end \data\creaturescripts\scripts\Zombie\onthink.lua
        function onThink(cid) local target = getCreatureTarget(cid) if(target ~= 0 and not isPlayer(target)) then doRemoveCreature(target) end return true end \data\globalevents\scripts\zombie\ onstartup.lua
        function onstartup() db.executeQuery("UPDATE `player_storage` SET `value` = 0 WHERE `key` = " .. ZE_isOnZombieArea .. ";") doSetStorage(ZE_STATUS, 0) doSetStorage(ZE_PLAYERS_NUMBER, ZE_DEFAULT_NUMBER_OF_PLAYERS) doSetStorage(ZE_ZOMBIES_TO_SPAWN, 0) doSetStorage(ZE_ZOMBIES_SPAWNED, 0) addZombiesEventBlockEnterPosition() return true end \data\globalevents\scripts\zombie\onthink.lua
        function onThink(interval, lastExecution, thinkInterval) if(getStorage(ZE_STATUS) == 2) then setZombiesToSpawnCount(getZombiesToSpawnCount()+1) local players = getZombiesEventPlayers() for i=1, getZombiesToSpawnCount() * 2 do if(getZombiesToSpawnCount() > 0 and spawnNewZombie()) then setZombiesToSpawnCount(getZombiesToSpawnCount()-1) end end end return true end \data\lib\zombie_event.lua
        -- CONFIG ZE_DEFAULT_NUMBER_OF_PLAYERS = 20 ZE_ACCESS_TO_IGNORE_ARENA = 4 -- POSITIONS ZE_blockEnterItemPosition = {x=32341, y=32213, z=7} -- onde nasce o teleport? ZE_enterPosition = {x=32154, y=32578, z=7} -- onde os players nascem dentro da arena zombie? ZE_kickPosition = {x=32368, y=32241, z=7} -- quando morre vai para onde? ZE_spawnFromPosition = {x=32140,y=32566,z=7} -- para sumonar zombie (de) ZE_spawnToPosition = {x=32168,y=32590,z=7} -- para sumonar zombie (ate) -- ITEM IDS --ZE_blockEnterItemID = 2700 ZE_blockEnterItemID = 1387 -- STORAGES -- - player ZE_isOnZombieArea = 34370 -- - global ZE_STATUS = 34370 -- =< 0 - off, 1 - waiting for players, 2 - is running ZE_PLAYERS_NUMBER = 34371 ZE_ZOMBIES_TO_SPAWN = 34372 ZE_ZOMBIES_SPAWNED = 34373 -- FUNCTION function setZombiesEventPlayersLimit(value) doSetStorage(ZE_PLAYERS_NUMBER, value) end function getZombiesEventPlayersLimit() return getStorage(ZE_PLAYERS_NUMBER) end function addPlayerToZombiesArea(cid) doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT) doTeleportThing(cid, ZE_enterPosition, true) doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT) if(getPlayerAccess(cid) < ZE_ACCESS_TO_IGNORE_ARENA) then setPlayerZombiesEventStatus(cid, os.time()) end end function kickPlayerFromZombiesArea(cid) doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT) doTeleportThing(cid, ZE_kickPosition, true) doSendMagicEffect(getThingPosition(cid), CONST_ME_TELEPORT) setPlayerZombiesEventStatus(cid, 0) end function getPlayerZombiesEventStatus(cid) return getCreatureStorage(cid, ZE_isOnZombieArea) end function setPlayerZombiesEventStatus(cid, value) doCreatureSetStorage(cid, ZE_isOnZombieArea, value) end function getZombiesEventPlayers() local players = {} for i, cid in pairs(getPlayersOnline()) do if(getPlayerZombiesEventStatus(cid) > 0) then table.insert(players, cid) end end return players end function getZombiesCount() return getStorage(ZE_ZOMBIES_SPAWNED) end function addZombiesCount() doSetStorage(ZE_ZOMBIES_SPAWNED, getStorage(ZE_ZOMBIES_SPAWNED)+1) end function resetZombiesCount() doSetStorage(ZE_ZOMBIES_SPAWNED, 0) end function getZombiesToSpawnCount() return getStorage(ZE_ZOMBIES_TO_SPAWN) end function setZombiesToSpawnCount(count) doSetStorage(ZE_ZOMBIES_TO_SPAWN, count) end function addZombiesEventBlockEnterPosition() -- remove tp -- remove o TP local item = getTileItemById(ZE_blockEnterItemPosition, ZE_blockEnterItemID) if(item.uid ~= 0) then doRemoveItem(item.uid) end --doRemoveItem(getThingFromPos(Castle.desde).uid) --[[ if(getTileItemById(ZE_blockEnterItemPosition, ZE_blockEnterItemID).uid == 0) then doCreateItem(ZE_blockEnterItemID, 1, ZE_blockEnterItemPosition) end ]]-- end function removeZombiesEventBlockEnterPosition() -- add tp if(getTileItemById(ZE_blockEnterItemPosition, ZE_blockEnterItemID).uid == 0) then --doCreateItem(ZE_blockEnterItemID, 1, ZE_blockEnterItemPosition) local tp = doCreateTeleport(ZE_blockEnterItemID, ZE_enterPosition, ZE_blockEnterItemPosition) doItemSetAttribute(tp, "aid", "5555") end --[[ local item = getTileItemById(ZE_blockEnterItemPosition, ZE_blockEnterItemID) if(item.uid ~= 0) then doRemoveItem(item.uid) end ]]-- end function spawnNewZombie() local posx = {} local posy = {} local posz = {} local pir = {} for i=1, 5 do local posx_tmp = math.random(ZE_spawnFromPosition.x ,ZE_spawnToPosition.x) local posy_tmp = math.random(ZE_spawnFromPosition.y ,ZE_spawnToPosition.y) local posz_tmp = math.random(ZE_spawnFromPosition.z ,ZE_spawnToPosition.z) local pir_tmp = 0 local spec = getSpectators({x=posx_tmp, y=posy_tmp, z=posz_tmp}, 3, 3, false) if(spec and #spec > 0) then for z, pid in pairs(spec) do if(isPlayer(pid)) then pir_tmp = pir_tmp + 1 end end end posx[i] = posx_tmp posy[i] = posy_tmp posz[i] = posz_tmp pir[i] = pir_tmp end local lowest_i = 1 for i=2, 5 do if(pir[i] < pir[lowest_i]) then lowest_i = i end end local ret = doCreateMonster("Zombie Event", {x=posx[lowest_i], y=posy[lowest_i], z=posz[lowest_i]}, false) if type(ret) == "number" then addZombiesCount() setGlobalStorageValue(201201051801, ret) end return type(ret) == "number" end \data\movements\scripts\zombie\ onenter.lua
        function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) if(not isPlayer(cid)) then return true end if(getPlayerAccess(cid) >= ZE_ACCESS_TO_IGNORE_ARENA) then addPlayerToZombiesArea(cid) elseif(#getZombiesEventPlayers() < getZombiesEventPlayersLimit() and getStorage(ZE_STATUS) == 1) then addPlayerToZombiesArea(cid) local players_on_arena_count = #getZombiesEventPlayers() if(players_on_arena_count == getZombiesEventPlayersLimit()) then addZombiesEventBlockEnterPosition() -- removeTP doSetStorage(ZE_STATUS, 2) doBroadcastMessage("Zombie Arena Event started.") else doBroadcastMessage(getCreatureName(cid) .. " has entered a Zombie Arena. We still need " .. getZombiesEventPlayersLimit() - players_on_arena_count .. " players.") end else doTeleportThing(cid, fromPosition, true) addZombiesEventBlockEnterPosition() end return true end \data\talkactions\scripts\zombie\ onsay.lua
        function onSay(cid, words, param, channel) if(getStorage(ZE_STATUS) ~= 2) then local players_on_arena_count = #getZombiesEventPlayers() if(param == 'force') then if(players_on_arena_count > 0) then setZombiesEventPlayersLimit(players_on_arena_count ) addZombiesEventBlockEnterPosition() doSetStorage(ZE_STATUS, 2) doBroadcastMessage("Zombie Arena Event started.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Zombies event started.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Cannot start Zombies event. There is no players on arena.") end else if(param ~= '' and tonumber(param) > 0) then setZombiesEventPlayersLimit(tonumber(param)) end removeZombiesEventBlockEnterPosition() doSetStorage(ZE_STATUS, 1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Event started.") doPlayerBroadcastMessage(cid, "Zombie Arena Event teleport is opened. We are waiting for " .. getZombiesEventPlayersLimit() - players_on_arena_count .. " players to start.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Zombies event is already running.") end return true end data\monster\zombie_event.xml
        <monster name="Zombie Event" nameDescription="an event zombie" race="undead" experience="480" speed="170" manacost="0"> <health now="20000" max="20000"/> <look type="311" corpse="9875"/> <targetchange interval="5000" chance="50"/> <strategy attack="100" defense="0"/> <flags> <flag summonable="0"/> <flag attackable="1"/> <flag hostile="1"/> <flag illusionable="0"/> <flag convinceable="0"/> <flag pushable="0"/> <flag canpushitems="1"/> <flag canpushcreatures="1"/> <flag targetdistance="1"/> <flag staticattack="90"/> <flag runonhealth="0"/> </flags> <attacks> <attack name="melee" interval="1000" min="-1500" max="-2350"/> </attacks> <defenses armor="0" defense="0"/> <immunities> <immunity paralyze="1"/> <immunity invisible="1"/> <immunity fire="1"/> <immunity energy="1"/> <immunity poison="1"/> </immunities> <voices interval="5000" chance="10"> <voice sentence="You wont last long!"/> <voice sentence="Mmmmh.. braains!"/> </voices> <script> <event name="ZombieThink"/> <event name="ZombieDeath"/> </script> <loot> </loot> </monster> Agora as Tags nos xml’s . /data/creaturescripts/creaturescripts.xml
        <event type="think" name="ZombieThink" event="script" value="zombie/onthink.lua"/> <event type="statschange" name="ZombieAttack" event="script" value="zombie/onattack.lua"/> <event type="death" name="ZombieDeath" event="script" value="zombie/ondeath.lua"/> /data/globalevents/globalevents.xml
        <globalevent name="ZombieGlobalThink" interval="5000" event="script" value="zombie/onthink.lua"/> <globalevent name="ZombieGlobalStartup" type="start" event="script" value="zombie/onstartup.lua"/> /data/movements/movements.xml
        <movevent type="StepIn" actionid="5555" event="script" value="zombie/onenter.lua"/> /data/talkactions/talkactions.xml
        <talkaction log="yes" words="/zombiestart" access="4" event="script" value="zombie/onsay.lua"/> /data/monster/monsters.xml
        <monster name="Zombie Event" file="zombie_event.xml"/> Script Terminado ! Next: Tutorial de como configurar o zombie event ! Estarei postando apenas as partes q podem ou devem ser editadas em cada script. data\creaturescripts\scripts\zombiez\onattack.lua
      Next: \data\lib\zombie_event.lua
      Então galera eh isso ai .-. meu primeiro post não mim crucifiquem k Duvidas, reclamações elogios chigamentos u.u só comentar como dizia o mestre o topico ta explicado nos minimos detalhes e ''de forma bem entendida'' (entendedoresentenderam) então eh isso vlw ai a todos q mim ajudaram nisso e nem sabem ?
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo