Ir para conteúdo
  • 0

(BUG) NPC Hunter


BrunooMaciell

Pergunta

Estou com um BUG no NPC Hunter.

 

BUG

[14/07/2020 13:59:44] [Error - Npc interface] 
[14/07/2020 13:59:44] data/npc/scripts/pvp/.aHunter.lua:onThink
[14/07/2020 13:59:44] Description: 
[14/07/2020 13:59:44] data/npc/scripts/pvp/.aHunter.lua:185: attempt to call global 'selfAttackCreature' (a nil value)
[14/07/2020 13:59:44] stack traceback:
[14/07/2020 13:59:44] 	data/npc/scripts/pvp/.aHunter.lua:185: in function <data/npc/scripts/pvp/.aHunter.lua:83>

SCRIPT

local target = 0
local prevTarget = 0
local origPos = 0
local max_distance = 12
local fighting = false
local challenger = 0
local battle_turn = 1		-- don't change
local challenger_turn = 0	-- don't change
---
--/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--
local function doSummonGymPokemon(npc)
	local this = npc
	if not isCreature(this) or not ehNPC(this) then return true end  --alterado v1.6
	if #getCreatureSummons(this) >= 1 or target == 0 then return true end
	local it = wildHunter[getPlayerStorageValue(this, 665471)][battle_turn]
	if not it then return true end
	doSummonMonster(this, it.name)              
	local summon = getCreatureSummons(this)[1]
	if not summon then                                              --alterado v1.6
       print("Error in npc: "..getCreatureName(this)..", tring to execute function 'doSummonGymPokemon', poke: "..it.name)
       battle_turn = battle_turn+1
       return true 
    end
	local balleffect = pokeballs["normal"].effect
		if it.ball and pokeballs[it.ball] then
			balleffect = pokeballs[it.ball].effect
		end
	doSendMagicEffect(getThingPos(summon), balleffect)
	setPlayerStorageValue(summon, 10000, balleffect)
	setPlayerStorageValue(summon, 10001, gobackmsgs[math.random(#gobackmsgs)].back:gsub("doka", it.nick ~= "" and it.nick or it.name))
	setPlayerStorageValue(summon, 1007, it.nick ~= "" and it.nick or it.name)
	doSetMonsterGym(summon, target)
	addEvent(adjustWildPoke, 15, summon, it.optionalLevel)
	if it.nick ~= "" then doCreatureSetNick(summon, it.nick) end
	local name = it.nick ~= "" and it.nick or getCreatureName(this).."s "..it.name    --alterado v1.3
	doCreatureSay(this, gobackmsgs[math.random(#gobackmsgs)].go:gsub("doka", getPlayerStorageValue(summon, 1007)), 1)
	fighting = true
	battle_turn = battle_turn + 1
end
--/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--
local function goToOrigPos()
target = 0
selfFollow(0)
fighting = false
challenger = 0
challenger_turn = 0
if #getCreatureSummons(getNpcCid()) >= 1 then
   setPlayerStorageValue(getCreatureSummons(getNpcCid())[1], 1006, 0)
   doCreatureAddHealth(getCreatureSummons(getNpcCid())[1], -getCreatureMaxHealth(getCreatureSummons(getNpcCid())[1]))
end
doChangeSpeed(getNpcCid(), -getCreatureSpeed(getNpcCid()))
doTeleportThing(getNpcCid(), origPos)
end
--/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--
local function updateTarget()
if(target == 0) then
    local list = getSpectators(getNpcPos(), 9, 9, false)
    for i = 1, table.getn(list) do
        local _target = list[i]
        if(_target ~= 0) then
           if isPlayer(_target) and not getTileInfo(getThingPos(_target)).protection then --alterado v1.8
              selfSay(hunterTalks[math.random(#hunterTalks)])
              doNpcSetCreatureFocus(_target) 
              target = _target
              prevTarget = target
              break
           end
        end
    end
end
end
--/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--
function onCreatureAppear(cid)
end

function onCreatureDisappear(cid)
end

function onCreatureMove(creature, oldPos, newPos)
--
end
--/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--
function onThink()
if not isCreature(getNpcCid()) then return false end  --alterado v1.6
if origPos == 0 then
   origPos = getNpcPos()
end
if getPlayerStorageValue(getNpcCid(), 665471) <= 0 then
   setPlayerStorageValue(getNpcCid(), 665471, math.random(1, 5))
   randOutfit(getNpcCid())
end
updateTarget()
------------------------------------------------------
if getDistanceBetween(getNpcPos(), origPos) >= max_distance or (isCreature(target) and getTileInfo(getThingPos(target)).protection) or getTileInfo(getThingPos(getNpcCid())).protection then  
goToOrigPos()                                                                                                                          --alterado v1.9
end
------------------------------------------------------
if(target == 0) then
if getPlayerStorageValue(getNpcCid(), 154788) <= 0 then
   setPlayerStorageValue(getNpcCid(), 154788, 1)
   doChangeSpeed(getNpcCid(), -getCreatureSpeed(getNpcCid()))
   addEvent(randWalk, 2000, getNpcCid(), 1000, getPlayerStorageValue(getNpcCid(), 154788))
end
return true
end 
------------------------------------------------------
local playerPos = getThingPosWithDebug(target)   --alterado v1.6
local myPos = getNpcPos()
------------------------------------------------------
if(myPos.z ~= playerPos.z) then
goToOrigPos()
battle_turn = battle_turn == 1 and battle_turn or battle_turn-1
return true
end
------------------------------------------------------
if getDistanceBetween(playerPos, myPos) > max_distance then
goToOrigPos()
battle_turn = battle_turn == 1 and battle_turn or battle_turn-1
return true
end
------------------------------------------------------
if getDistanceBetween(playerPos, myPos) >= 5 then
if getPlayerStorageValue(getNpcCid(), 154788) >= 1 then
   setPlayerStorageValue(getNpcCid(), 154788, -1)
   doRegainSpeed(getNpcCid()) 
   if isCreature(target) then
      selfFollow(target)
   end
end
end
------------------------------------------------------
if getDistanceBetween(playerPos, myPos) <= 3 then
if getPlayerStorageValue(getNpcCid(), 154788) <= 0 then
   setPlayerStorageValue(getNpcCid(), 154788, 1)
   doChangeSpeed(getNpcCid(), -getCreatureSpeed(getNpcCid()))
   addEvent(randWalk, 2000, getNpcCid(), 1000, getPlayerStorageValue(getNpcCid(), 154788))
end
end
------------------------------------------------------
if getDistanceBetween(playerPos, myPos) <= 5 then
   challenger = target
   addEvent(doSummonGymPokemon, 1000, getNpcCid())

local change = false

if not isCreature(target) then
   target = 0
   battle_turn = battle_turn == 1 and battle_turn or battle_turn-1
   return true
end

if fighting then

   if not isCreature(getCreatureTarget(getNpcCid())) then
      if #getCreatureSummons(challenger) >= 1 then
         selfAttackCreature(getCreatureSummons(challenger)[1])
		 change = true
	  else
	      if change then
		     change = false
	         challenger_turn = challenger_turn + 1
		  end
      end
   end
		
   if #getCreatureSummons(getNpcCid()) == 0 and isCreature(target) then
      if battle_turn > #wildHunter[getPlayerStorageValue(getNpcCid(), 665471)] then      
         addEvent(doCreateNpc, 300000, ".aHunter", myPos)  --alterado v1.5
         local outfit = getCreatureOutfit(getNpcCid())
         doRemoveCreature(getNpcCid())
         ----------------------------------------
         if outfit.lookType == 1016 then      --verifica se o npc eh female.. ;p
             monster = doCreateMonster("aHunterFemale", myPos)
         else
             monster = doCreateMonster("aHunter", myPos)
         end
         ----------------------------------------
         doCloneOut(monster, outfit)
         addEvent(beDrunk, 100, monster)
      end
	     addEvent(doSummonGymPokemon, 1000, getNpcCid())
   end

   if #getCreatureSummons(challenger) <= 0 then
      selfAttackCreature(challenger) 
   end  
end
end
end

Quem puder ajudar  ^^

 

Rep+++

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Falta a função: 

selfAttackCreature

Já foi postado esta função aqui no fórum, ou você pode usar a src que foi liberada em um servidor que tem 3 funções que fazem o sistema de NPC's duel funcionarem.

@EDIT
Inclusive postaram ela em um tópico seu:

local function selfAttackCreature()
if #getCreatureSummons(getNpcCid()) > 0 and not isCreature(getCreatureTarget(getCreatureSummons(getNpcCid())[1])) then
	local list = getSpectators(getCreaturePosition(getNpcCid()), 7, 7, false)
	for i=0, table.getn(list) do
		local _target = list[i]
		if(_target ~= 0) then
			if isPlayer(_target) and not getTileInfo(getThingPos(_target)).protection then
				if #getCreatureSummfighting = falseons(_target) > 0 then
					doMonsterSetTarget(getCreatureSummons(getNpcCid())[1], getCreatureSummons(_target)[1])
					setPlayerStorageValue(getCreatureSummons(getNpcCid())[1], 99856201, getNpcCid())
				else
				  fighting = false
				end
				target = _target
				break
			end
		end
	end
end

end

 

Editado por Henrique
Link para o comentário
Compartilhar em outros sites

  • 0
39 minutos atrás, Henrique disse:

Falta a função: 


selfAttackCreature

Já foi postado esta função aqui no fórum, ou você pode usar a src que foi liberada em um servidor que tem 3 funções que fazem o sistema de NPC's duel funcionarem.

@EDIT
Inclusive postaram ela em um tópico seu:


local function selfAttackCreature()
if #getCreatureSummons(getNpcCid()) > 0 and not isCreature(getCreatureTarget(getCreatureSummons(getNpcCid())[1])) then
	local list = getSpectators(getCreaturePosition(getNpcCid()), 7, 7, false)
	for i=0, table.getn(list) do
		local _target = list[i]
		if(_target ~= 0) then
			if isPlayer(_target) and not getTileInfo(getThingPos(_target)).protection then
				if #getCreatureSummfighting = falseons(_target) > 0 then
					doMonsterSetTarget(getCreatureSummons(getNpcCid())[1], getCreatureSummons(_target)[1])
					setPlayerStorageValue(getCreatureSummons(getNpcCid())[1], 99856201, getNpcCid())
				else
				  fighting = false
				end
				target = _target
				break
			end
		end
	end
end

end

 

puts irmao nem lembro mais esta script tem como errumo ou add esta funçao nela se esta script sua aii e a funçao onde posso ta colocando ela na script ?

Link para o comentário
Compartilhar em outros sites

  • 0
Em 14/07/2020 em 17:11, BrunooMaciell disse:

puts irmao nem lembro mais esta script tem como errumo ou add esta funçao nela se esta script sua aii e a funçao onde posso ta colocando ela na script ?

Coloque a função no arquivo functions.lua ou some.functions.lua na pasta Data/Lib, onde preferir. Mas, coloque em algum arquivo de scripts de funções na pasta Lib, é melhor.

Link para o comentário
Compartilhar em outros sites

  • 0
1 hora atrás, Yan18 disse:

Coloque a função no arquivo functions.lua ou some.functions.lua na pasta Data/Lib, onde preferir. Mas, coloque em algum arquivo de scripts de funções na pasta Lib, é melhor.

Bom posso posta a script e tu add pra min e que tenho medo de add errado =/

 

Se sim qual script se acha melhor ??

Link para o comentário
Compartilhar em outros sites

  • 0
1 hora atrás, BrunooMaciell disse:

Bom posso posta a script e tu add pra min e que tenho medo de add errado =/

 

Se sim qual script se acha melhor ??

Posso colocar sim, sem problemas. Mas, é bem simples, vai na última linha do arquivo que vai colocar e vai no último end, da enter e cola a função em baixo (recomendo comentar em cima do nome da função para saber o que faz), não tem segredo.

 

Sobre qual arquivo ser melhor, não importa muito onde vai colocar na pasta lib, depende da maneira como quer deixar organizado e separado os arquivos do seu servidor, pode colocar em algum arquivo onde tem funções novas do seu servidor (caso tenha). Mas, pode colocar em some functions.lua mesmo, acho que fica mais fácil para procurar depois.

Link para o comentário
Compartilhar em outros sites

  • 0
4 horas atrás, Yan18 disse:

Posso colocar sim, sem problemas. Mas, é bem simples, vai na última linha do arquivo que vai colocar e vai no último end, da enter e cola a função em baixo (recomendo comentar em cima do nome da função para saber o que faz), não tem segredo.

 

Sobre qual arquivo ser melhor, não importa muito onde vai colocar na pasta lib, depende da maneira como quer deixar organizado e separado os arquivos do seu servidor, pode colocar em algum arquivo onde tem funções novas do seu servidor (caso tenha). Mas, pode colocar em some functions.lua mesmo, acho que fica mais fácil para procurar depois.

function getStringOfTaskArray(array)
   if type(array) ~= 'table' or not next(array) then return "" end
   
   local result = {}
    for _, value in ipairs(array) do
	    local thing, num = (type(value[1]) == 'string' and value[1] or getItemNameById(value[1])), value[2]
		table.insert(result, (_ == 1 and "" or ", ")..num.." "..thing..(num == 1 and "" or "s"))
    end
	result[#result] = " and"..(result[#result]:sub(2,#result[#result]))
	return table.concat(result)
end

function getVitalityByMaster(cid)
if not isCreature(cid) then return 0 end
local ball = getPlayerSlotItem(cid, 8).uid
if not ball or ball <= 1 or not pokes[getItemAttribute(ball, 'poke')] then return true end
   return pokes[getItemAttribute(ball, 'poke')].vitality * (getPlayerLevel(cid) + (getItemAttribute(ball, 'boost') or 0))
end

function onPokeHealthChange(cid, zerar)
   if not isCreature(cid) then return true end
   if zerar then doPlayerSendCancel(cid, '#ph#,0,0') end
   local ball = getPlayerSlotItem(cid, 8).uid
   if not ball or ball <= 1 or not pokes[getItemAttribute(ball, 'poke')] then return true end
   
   if #getCreatureSummons(cid) >= 1 and getPlayerStorageValue(cid, 212124) <= 0 then   --alterado v1.6
      local pokemon = getCreatureSummons(cid)[1]
      local pokelife = (getCreatureHealth(pokemon) / getCreatureMaxHealth(pokemon))
      doItemSetAttribute(ball, "hp", pokelife)
   end
   
      local rd = 1 - (tonumber(getItemAttribute(ball, "hp")))
   local maxHp = HPperVITsummon * getVitalityByMaster(cid) 
   local hp = maxHp -(maxHp * rd)   
   doPlayerSendCancel(cid, '#ph#,'.. math.floor(hp) ..','.. math.floor(maxHp))
end

function addPokeToPlayer(cid, pokemon, boost, gender, ball)             --alterado v1.9 \/ peguem ele todo...
local genders = {
["male"] = 4,
["female"] = 3,
[1] = 4,
[0] = 3,
[4] = 4,
[3] = 3,
}
if not isCreature(cid) then return false end

local pokemon = doCorrectString(pokemon)
if not pokes[pokemon] then return false end

   local GENDER = (gender and genders[gender]) and genders[gender] or getRandomGenderByName(pokemon)
   local btype = (ball and pokeballs[ball]) and ball or isShinyName(pokemon) and "shinynormal" or "normal"
   local happy = 250
   
   if icons[pokemon] then
      id = icons[pokemon].on
   else
      id = pokeballs[btype].on
   end

   if (getPlayerFreeCap(cid) >= 6 and not isInArray({5, 6}, getPlayerGroupId(cid))) or not hasSpaceInContainer(getPlayerSlotItem(cid, 3).uid) then 
      item = doCreateItemEx(id)
   else
      item = addItemInFreeBag(getPlayerSlotItem(cid, 3).uid, id, 1)   
   end
   if not item then return false end

   doItemSetAttribute(item, "poke", pokemon)
   doItemSetAttribute(item, "hp", 1)
   doItemSetAttribute(item, "happy", happy)
   --doItemSetAttribute(item, "-1", GENDER)
   doSetItemAttribute(item, "hands", 0)
   doItemSetAttribute(item, "description", "Contains a "..pokemon..".")
   doItemSetAttribute(item, "fakedesc", "Contains a "..pokemon..".") 
   doItemSetAttribute(item, "defeated", "no")
   doItemSetAttribute(item, "ball", btype)
   doItemSetAttribute(item, "tadport", fotos[pokemon])
   if boost and tonumber(boost) and tonumber(boost) > 0 and tonumber(boost) <= 50 then
      doItemSetAttribute(item, "boost", boost)
   end
   if unique then
      doItemSetAttribute(item, "unique", getCreatureName(cid))
   end
                                                                             
   if (getPlayerFreeCap(cid) >= 6 and not isInArray({5, 6}, getPlayerGroupId(cid))) or not hasSpaceInContainer(getPlayerSlotItem(cid, 3).uid) then
      doPlayerSendMailByName(getCreatureName(cid), item, 1)
      sendMsgToPlayer(cid, 27, "You are already holding six pokemons, so your new pokemon was sent to your depot.")
   end
   doTransformItem(item, id)
return true
end 
---------------------------

function unLock(ball)                                                             
if not ball or ball <= 0 then return false end
if getItemAttribute(ball, "lock") and getItemAttribute(ball, "lock") > 0 then
   local vipTime = getItemAttribute(ball, "lock")
   local timeNow = os.time()
   local days = math.ceil((vipTime - timeNow)/(24 * 60 * 60))
   if days <= 0 then
      doItemEraseAttribute(ball, "lock")    
      doItemEraseAttribute(ball, "unique")
      return true
   end
end
return false
end

function getGuildMembersOnline(GuildId)
local players = {}
for _, pid in pairs(getPlayersOnline()) do
    if getPlayerGuildId(pid) == tonumber(GuildId) then
       table.insert(players, pid)
    end
end                                                   --by Vodkart
return #players > 0 and players or false
end

function getGuildMembers(GuildId)
local players,query = {},db.getResult("SELECT `name` FROM `players` WHERE `rank_id` IN (SELECT `id` FROM `guild_ranks` WHERE `guild_id` = " .. GuildId .. ");")
if (query:getID() ~= -1) then  
   repeat
         table.insert(players,query:getDataString("name"))
   until not query:next()                           --by Vodkart
   query:free()
end
return #players > 0 and players or false
end 
--/////////////////////////////////////////////////////////////////////////////////---
function sendMsgToPlayer(cid, tpw, msg)      --alterado v1.7 \/\/\/
if not isCreature(cid) or not tpw or not msg then return true end
return doPlayerSendTextMessage(cid, tpw, msg)
end

function getPlayerDesc(cid, thing, TV)
if (not isCreature(cid) or not isCreature(thing)) and not TV then return "" end

local pos = getThingPos(thing)
local ocup = youAre[getPlayerGroupId(thing)]
local rank = (getPlayerStorageValue(thing, 86228) <= 0) and "a Pokemon Trainer" or lookClans[getPlayerStorageValue(thing, 86228)][getPlayerStorageValue(thing, 862281)]
local name = thing == cid and "yourself" or getCreatureName(thing)     
local art = thing == cid and "You are" or (getPlayerSex(thing) == 0 and "She is" or "He is")
   
local str = {}
table.insert(str, "You see "..name..". "..art.." ")
if youAre[getPlayerGroupId(thing)] then
   table.insert(str, (ocup).." and "..rank.." from ".. getTownName(getPlayerTown(thing))..".")       
else
   table.insert(str, (rank).." from ".. getTownName(getPlayerTown(thing))..".")
end
if getPlayerGuildId(thing) > 0 then
   table.insert(str, " "..art.." "..getPlayerGuildRank(thing).." from the "..getPlayerGuildName(thing)..".")
end
if TV then
   table.insert(str, " "..art.." watching TV.")
end
table.insert(str, ((isPlayer(cid) and youAre[getPlayerGroupId(cid)]) and "\nPosition: [X: "..pos.x.."][Y: "..pos.y.."][Z: "..pos.z.."]" or "")) 

return table.concat(str) 
end

function doRevivePokemon(cid, pokemon)
  if getPlayerItemCount(cid, 12344) <= 0 then return doPlayerSendCancel(cid, "Voce nao tem nenhum revive.") end
  local cooldownMoves = {
    ["Selfdestruct"] = 30,
    ["Selfdestruction"] = 30,
  }
  local balls = getPokeballsInContainerNew(getPlayerSlotItem(cid, 3).uid)
  if isPokeball(getPlayerSlotItem(cid, CONST_SLOT_FEET).itemid) then
    table.insert(balls, getPlayerSlotItem(cid, CONST_SLOT_FEET))
  end
  for i =1, #balls do
    local ball = balls[i]
	-- print("Pokemon: "..pokemon.." attrpoke> "..(getItemAttribute(ball.uid, "poke") or "sempoke").." attrnick> "..(getItemAttribute(ball.uid, "nick") or "sem nick"))
    if getItemAttribute(ball.uid, "poke") == pokemon or getItemAttribute(ball.uid, "nick") == pokemon then
	  -- print("IGUAL")
      for type, index in pairs(pokeballs) do
	    -- print(index.on.." / "..index.off)
	    if ball.itemid == index.on or ball.itemid == index.off then
		  -- print("revive")
		  doTransformItem(ball.uid, index.on)
          doSetItemAttribute(ball.uid, "hp", 1)
          local name = getItemAttribute(ball.uid, "poke")
          for c = 1, 15 do
            local str = "move"..c
            local move = movestable[name][str]; move = move and cooldownMoves[move.name]
            setCD(ball.uid, str, move or 0)
          end
          setCD(ball.uid, "control", 0)
          setCD(ball.uid, "blink", 0) --alterado v1.6
          doSendMagicEffect(getThingPos(cid), 13)
		  doPlayerRemoveItem(cid, 12344, 1)
          doCureBallStatus(ball.uid, "all")
		  doUpdatePokemonsBar(cid)
	      cleanBuffs2(ball.uid) --alterado v1.5
		  return
		end
	  end
	end
  end
end

function getPokeballsInContainerNew(container)
  if not isContainer(container) then return {} end
  local items = {}
  if isContainer(container) and getContainerSize(container) > 0 then
  	for slot=0, (getContainerSize(container)-1) do
      local item = getContainerItem(container, slot)
      if isContainer(item.uid) then
      	local itemsbag = getPokeballsInContainerNew(item.uid)
      	for i=0, #itemsbag do
          table.insert(items, itemsbag[i])
      	end
      elseif isPokeball(item.itemid) then
      	table.insert(items, item)
      end
  	end
  end
  return items
end

-------------------------------------------------------------------------------------------------   /\/\
function getLivePokeballs(cid, container, duel) 
    if not isCreature(cid) then return {} end     
	if not isContainer(container) then return {} end
	local items = {}
	---
	local ballSlot = getPlayerSlotItem(cid, 8)
    if ballSlot.uid ~= 0 then
       for a, b in pairs (pokeballs) do
           if ballSlot.itemid == b.on or ballSlot.itemid == b.use then
              if duel and getPlayerLevel(cid) >= (pokes[getItemAttribute(ballSlot.uid, "poke")].level + getPokeballBoost(ballSlot)) then
                 table.insert(items, ballSlot.uid)                                                                      --alterado v1.8
              elseif not duel then
                 table.insert(items, ballSlot.uid)
              end
           end
       end
    end
    ---     
	if isContainer(container) and getContainerSize(container) > 0 then      
		for slot=0, (getContainerSize(container)-1) do
			local item = getContainerItem(container, slot)
				if isContainer(item.uid) then
					local itemsbag = getPokeballsInContainer(item.uid)
					for i=0, #itemsbag do
						if not isInArray(items, itemsbag[i]) then
                           table.insert(items, itemsbag[i])
                        end
					end
				elseif isPokeball(item.itemid) then
				    for a, b in pairs (pokeballs) do
                        if item.itemid == b.on then
                           if duel and getPlayerLevel(cid) >= (pokes[getItemAttribute(item.uid, "poke")].level + getPokeballBoost(item)) then    
					          table.insert(items, item.uid)                                            --alterado v1.8
                           elseif not duel then
                              table.insert(items, item.uid)
                           end
	                    end
                    end
				end
		end
	end
return items
end

function addItemInFreeBag(container, item, num)
if not isContainer(container) or not item then return false end                                             
if not num or num <= 0 then num = 1 end                                            --alterado v1.6.1
if getContainerSize(container) < getContainerCap(container) then
   return doAddContainerItem(container, item, num)
else
   for slot = 0, (getContainerSize(container)-1) do
       local container2 = getContainerItem(container, slot)
       if isContainer(container2.uid) and getContainerSize(container2.uid) < getContainerCap(container2.uid) then
          return doAddContainerItem(container2.uid, item, num)
       end
   end
end
return false
end
------------------------------------------------------------------------------------------------------
function pokeHaveReflect(cid)
if not isCreature(cid) then return false end
local table = getTableMove(cid, "Reflect")
if table and table.name then     --alterado v1.6
   return true 
end
return false
end
------------------------------------------------------------------------------------------------------
function nextHorario(cid)
    horarioAtual = os.date("%X")
    horario = string.explode(horarioAtual, ":")
    
    for i = 1, #horas do
        horarioComparacao = horas[i]
        horarioComp = string.explode(horarioComparacao, ":")
        ---------------
        if tonumber(horarioComp[1]) > tonumber(horario[1]) then
           return horarioComparacao                                
        elseif tonumber(horarioComp[1]) == tonumber(horario[1]) and tonumber(horario[2]) < tonumber(horarioComp[2]) then
           return horarioComparacao
        end
    end 
    return horas[1]                                  
end                                                               

function getTimeDiff(timeDiff)
local dateFormat = {
{'hour', timeDiff / 60 / 60}, --6%
{'min', timeDiff / 60 % 60},
}
local out = {}                                   
for k, t in ipairs(dateFormat) do
    local v = math.floor(t[2])
    if(v > -1) then
         table.insert(out, (k < #dateFormat and '' or ' and ') .. v .. '' .. (v <= 1 and t[1] or t[1].."s"))
    end
end
if tonumber(dateFormat[1][2]) == 0 and tonumber(dateFormat[2][2]) == 0 then
   return "seconds"
end
return table.concat(out)
end

function getTimeDiff2(timeDiff)
local dateFormat = {
{'hour', timeDiff / 60 / 60}, --6%
{'min', timeDiff / 60 % 60},
{'sec', timeDiff % 60},
}
local out = {}                                  
for k, t in ipairs(dateFormat) do
    local v = math.floor(t[2])
    if(v > 0) then
         table.insert(out, (k < #dateFormat and ' ' or ' and ') .. v .. '' .. (v <= 1 and t[1] or t[1].."s"))
    end
end
return table.concat(out)
end 

function showTimeDiff(timeComp)
local b = string.explode(os.date("%X"), ":")
local c = string.explode(timeComp, ":")
    ---
    local d, m, y = os.date("%d"), os.date("%m"), os.date("%Y")
    local hAtual, mAtual = tonumber(b[1]), tonumber(b[2])
    local hComp, mComp = tonumber(c[1]), tonumber(c[2])
    ---
    local t = os.time{year= y, month= m, day= d, hour= hAtual, min= mAtual}
    local t1 = os.time{year= y, month= m, day= d, hour= hComp, min= mComp}
    ---                                                                       
    comparacao = t1-t
    if hComp < hAtual then
       v = os.time{year= y, month= m, day= d, hour= 24, min= 0}
       v2 = os.time{year= y, month= m, day= d, hour= 0, min= 0}
       comparacao = (v-t)+(t1-v2)
    end
return getTimeDiff(comparacao)
end
-------------------------------------------------------------------------
function cleanCMcds(item)
if item ~= 0 then
   for c = 1, 15 do              --alterado v1.5
      local str = "cm_move"..c
      setCD(item, str, 0)
   end
end
end

function ehNPC(cid)   --alterado v1.9
return isCreature(cid) and not isPlayer(cid) and not isSummon(cid) and not isMonster(cid)
end

function ehMonstro(cid)
local eh = false
    if not isSummon(cid) and not ehNPC(cid) and not isPlayer(cid) then
        eh = true
    end
    return eh
end                                                      --alterado v1.9.1 /\

function doAppear(cid) --Faz um poke q tava invisivel voltar a ser visivel...
if not isCreature(cid) then return true end
doRemoveCondition(cid, CONDITION_INVISIBLE)
doRemoveCondition(cid, CONDITION_OUTFIT)
doCreatureSetHideHealth(cid, false)
end

function doDisapear(cid)   --Faz um pokemon ficar invisivel
if not isCreature(cid) then return true end
doCreatureAddCondition(cid, permanentinvisible)
doCreatureSetHideHealth(cid, true)
doSetCreatureOutfit(cid, {lookType = 2}, -1)
end

function getThingFromPosWithProtect(pos)  --Pega uma creatura numa posiçao com proteçoes
if hasTile(pos) then
   if isCreature(getRecorderCreature(pos)) then
      return getRecorderCreature(pos)
   else
      pos.stackpos = 253
      pid = getThingfromPos(pos).uid
   end
else
   pid = getThingfromPos({x=1,y=1,z=10,stackpos=253}).uid
end
return pid
end

function getTileThingWithProtect(pos)    --Pega um TILE com proteçoes
if hasTile(pos) then
pos.stackpos = 0
   pid = getTileThingByPos(pos)
else
   pid = getTileThingByPos({x=1,y=1,z=10,stackpos=0})
end
return pid
end

function canAttackOther(cid, pid)         --Function q verifica se um poke/player pode atacar outro poke/player

if not isCreature(cid) or not isCreature(pid) then return "Cant" end

local master1 = isSummon(cid) and getCreatureMaster(cid) or cid
local master2 = isSummon(pid) and getCreatureMaster(pid) or pid
   
   ----             
   if getPlayerStorageValue(master1, 6598754) >= 5 and getPlayerStorageValue(master2, 6598754) >= 5 then
      if getPlayerStorageValue(master1, 6598754) ~= getPlayerStorageValue(master2, 6598754) then
         if isDuelingAgainst(master1, master2) then   --alterado v1.8
            if isSummon(cid) and isPlayer(pid) then
               return "Cant"
            else
               return "Can"
            end
         end
      end
   end
   ----              pvp system
   if getPlayerStorageValue(master1, 6598754) >= 1 and getPlayerStorageValue(master2, 6598755) >= 1 then
      return "Can" 
   end
   if getPlayerStorageValue(master1, 6598755) >= 1 and getPlayerStorageValue(master2, 6598754) >= 1 then  ---estar em times diferentes
      return "Can"
   end
   ----
if getTileInfo(getThingPos(cid)).pvp then

return "Can"

end

   if ehMonstro(cid) or ehMonstro(pid) then
      return "Can"
   end

return "Cant"
end
   
      
function stopNow(cid, time)   
if not isCreature(cid) or not tonumber(time) or isSleeping(cid) then return true end
                                                        --alterado v1.9.1 \/
local function podeMover(cid)                         
if isPlayer(cid) then 
   mayNotMove(cid, false) 
elseif isCreature(cid) then 
   doRegainSpeed(cid) 
end
end

if isPlayer(cid) then mayNotMove(cid, true) else doChangeSpeed(cid, -getCreatureSpeed(cid)) end
addEvent(podeMover, time, cid)
end

function doReduceStatus(cid, off, def, agi)   --reduz os status
if not isCreature(cid) then return true end
local A = getOffense(cid)
local B = getDefense(cid)
local C = getSpeed(cid)

if off > 0 then
   setPlayerStorageValue(cid, 1001, A - off)
end
if def > 0 then
   setPlayerStorageValue(cid, 1002, B - def)
end
if agi > 0 then
   setPlayerStorageValue(cid, 1003, C - agi)
   if getCreatureSpeed(cid) ~= 0 then
      doRegainSpeed(cid)
   end                                              --alterado v1.5  functions arrumadas...
end
end

function doRaiseStatus(cid, off, def, agi, time)  
if not isCreature(cid) then return true end
local A = getOffense(cid)
local B = getDefense(cid)
local C = getSpeed(cid)

if off > 0 then
   setPlayerStorageValue(cid, 1001, A * off)
end
if def > 0 then
   setPlayerStorageValue(cid, 1002, B * def)
end
if agi > 0 then
   setPlayerStorageValue(cid, 1003, C + agi)
   if getCreatureSpeed(cid) ~= 0 then
      doRegainSpeed(cid)
   end
end

local D = getOffense(cid)
local E = getDefense(cid)
local F = getSpeed(cid)
---------------------------
local G = D - A
local H = E - B
local I = F - C

addEvent(doReduceStatus, time*500, cid, G, H, I)
end


function BackTeam(cid)          
  if isCreature(cid) then
     local summon = getCreatureSummons(cid)   --alterado v1.6
     for i = 2, #summon do
         doSendMagicEffect(getThingPos(summon[i]), 211)
         doRemoveCreature(summon[i])
     end
     setPlayerStorageValue(cid, 637501, -1)
  end  
end
    
function choose(...) -- by mock
    local arg = {...}
    return arg[math.random(1,#arg)]
end

function AddPremium(cid, days)
local function removerPlayer(cid)
if isCreature(cid) then
   doRemoveCreature(cid)
end
end

db.executeQuery("UPDATE `accounts` SET `premdays` = '"..days.."' WHERE `accounts`.`id` = ".. getPlayerAccountId(cid) ..";")
doPlayerSendTextMessage(cid,25,"Você será kickado em 5 segundos.")    
addEvent(removerPlayer, 5*1000, cid)     
return TRUE
end

function isShiny(cid) 
return isCreature(cid) and string.find(getCreatureName(cid), "Shiny")  --alterado v1.9
end

function isShinyName(name)        
return tostring(name) and string.find(doCorrectString(name), "Shiny") --alterado v1.9
end

function doConvertTypeToStone(type, string)
local t = {
["fly"] = {heart, "heart"},
["flying"] = {heart, "heart"},
["normal"] = {heart, "heart"},
["fire"] = {fire, "fire"},
["grass"] = {leaf, "leaf"},
["leaf"] = {leaf, "leaf"},
["water"] = {water, "water"},
["poison"] = {venom, "venom"},
["venom"] = {venom, "venom"},
["electric"] = {thunder, "thunder"},
["thunder"] = {thunder, "thunder"},
["rock"] = {rock, "rock"},
["fight"] = {punch, "punch"},
["fighting"] = {punch, "punch"},
["bug"] = {coccon, "coccon"},
["dragon"] = {crystal, "crystal"},
["dark"] = {dark, "dark"},
["ghost"] = {dark, "dark"},
["ground"] = {earth, "earth"},
["earth"] = {earth, "earth"},
["psychic"] = {enigma, "enigma"},
["steel"] = {metal, "metal"},
["ancient"] = {ancient, "ancient"},
["metal"] = {metal, "metal"},
["ice"] = {ice, "ice"},
["boost"] = {boostStone, "boost"},  --alterado v1.9
}

if string then
return t[type][2]
else
return t[type][1]
end
end

function doConvertStoneIdToString(stoneID)
local t = {
[11453] = "Heart Stone",
[11441] = "Leaf Stone",
[11442] = "Water Stone",
[11443] = "Venom Stone",
[11444] = "Thunder Stone",
[11445] = "Rock Stone",
[11446] = "Punch Stone", 
[11447] = "Fire Stone",               --alterado v1.6
[11448] = "Cocoon Stone", 
[11449] = "Crystal Stone",
[11450] = "Darkess Stone", 
[11451] = "Earth Stone",
[11452] = "Enigma Stone",
[11454] = "Ice Stone", 
[12244] = "Ancient Stone",
[12232] = "Metal Stone",
[12401] = "Shiny Fire Stone",
[12402] = "Shiny Water Stone",
[12403] = "Shiny Leaf Stone",
[12404] = "Shiny Heart Stone",
[12405] = "Shiny Enigma Stone",
[12406] = "Shiny Rock Stone",
[12407] = "Shiny Venom Stone", 
[12408] = "Shiny Ice Stone",
[12409] = "Shiny Thunder Stone",
[12410] = "Shiny Crystal Stone",
[12411] = "Shiny Cocoon Stone",
[12412] = "Shiny Darkness Stone",
[12413] = "Shiny Punch Stone",
[12414] = "Shiny Earth Stone",
[boostStone] = "Boost Stone",  --alterado v1.9
[20897] = "Virus",
[20898] = "Glice Stone",
[20899] = "Green Stone",
[20900] = "Mag Stone",
[20901] = "Electri Stone",
[20902] = "Perior Stone",
[20903] = "Kiss Stone",
[20904] = "Shiny Stone",
[20905] = "Zone Stone",
[21996] = "Llade Stone",
[21997] = "Scor Stone",
[21998] = "Licky Stone",
[21999] = "Poryz Stone",
[22000] = "Probo Stone",
[22001] = "Wea Stone",
[22002] = "Yanm Stone",
[22003] = "Fros Stone",
[22004] = "Special Stone",
[22067] = "Super Darkness Stone",
[22068] = "Super Ice Stone",
[22071] = "Super Fire Stone",
[22072] = "Super Water Stone",
}
if t[stoneID] then
return t[stoneID]
else
return ""
end
end

function isStone(id)
if id >= leaf and id <= ice then
return true
end
if id == boostStone then  --alterado v1.9
return true
end
if id == 12232 or id == 12244 or id == 12244 or id == 12245 then
return true                                 
end
if id == 20904 then
return true                                 
end
if (id >= sfire and id <= searth) or id == 12417 or id == 12419 then
return true 
end
return false
end

function isWater(id)
return tonumber(id) and id >= 4820 and id <= 4825 --alterado v1.9
end

function getTopCorpse(position)
local pos = position
for n = 1, 255 do
    pos.stackpos = n
    local item = getTileThingByPos(pos)
    if item.itemid >= 2 and (string.find(getItemNameById(item.itemid), "fainted ") or string.find(getItemNameById(item.itemid), "defeated ")) then
       return getTileThingByPos(pos)
    end
end
return null
end

bpslot = CONST_SLOT_BACKPACK

function hasPokemon(cid)
	if not isCreature(cid) then return false end
	if getCreatureMana(cid) <= 0 then return false end
	if #getCreatureSummons(cid) >= 1 then return true end
	local item = getPlayerSlotItem(cid, CONST_SLOT_FEET)
	local bp = getPlayerSlotItem(cid, bpslot)
	for a, b in pairs (pokeballs) do
        if item.itemid == b.on or item.itemid == b.use then
        return true                              --alterado v1.4
        end
        if #getItemsInContainerById(bp.uid, b.on) >= 1 then
        return true
        end
	end
return false
end

function isNpcSummon(cid)
return isNpc(getCreatureMaster(cid))
end

--function getPokemonHappinessDescription(cid)
--	if not isCreature(cid) then return true end
--	local str = {}
	--if getPokemonGender(cid) == SEX_MALE then
	--	table.insert(str, "He")
	--elseif getPokemonGender(cid) == SEX_FEMALE then
	--	table.insert(str, "She")
	--else
	--	table.insert(str, "It")
	--end
	--local h = getPlayerStorageValue(cid, 1008)
--	if h >= tonumber(getConfigValue('PokemonStageVeryHappy')) then
--		table.insert(str, " is very happy with you!")
--	elseif h >= tonumber(getConfigValue('PokemonStageHappy')) then
--		table.insert(str, " is happy.")
--	elseif h >= tonumber(getConfigValue('PokemonStageOK')) then
--		table.insert(str, " is unhappy.")
--	elseif h >= tonumber(getConfigValue('PokemonStageSad')) then
--		table.insert(str, " is sad.")
--	elseif h >= tonumber(getConfigValue('PokemonStageMad')) then
--		table.insert(str, " is mad.")
--	else
--		table.insert(str, " is very mad at you!")
--	end
--return table.concat(str)
--end

function doSetItemAttribute(item, key, value)
doItemSetAttribute(item, key, value)
end

function deTransform(cid, check)
	if not isCreature(cid) then return true end

	local m = getCreatureMaster(cid)
	local p = getPlayerSlotItem(m, 8)

	if getItemAttribute(p.uid, "transTurn") ~= check then return true end

	setPlayerStorageValue(cid, 1010, getCreatureName(cid) == "Ditto" and "Ditto" or "Shiny Ditto")        --edited
	doRemoveCondition(cid, CONDITION_OUTFIT)
	doSendMagicEffect(getThingPos(cid), 184)
	doCreatureSay(cid, "DITTO!", TALKTYPE_MONSTER)
	doItemSetAttribute(p.uid, "transBegin", 0)
	doItemSetAttribute(p.uid, "transLeft", 0)
	doItemEraseAttribute(p.uid, "transName")
	adjustStatus(cid, p.uid, true, true, true)
end

function isTransformed(cid)
return isCreature(cid) and not isInArray({-1, "Ditto", "Shiny Ditto"}, getPlayerStorageValue(cid, 1010))  --alterado v1.9
end

function doSendFlareEffect(pos)
	local random = {28, 29, 79}
	doSendMagicEffect(pos, random[math.random(1, 3)])
end

function isDay()
	local a = getWorldTime()
	if a >= 360 and a < 1080 then
	return true
	end
return false
end

function doPlayerSendTextWindow(cid, p1, p2)
	if not isCreature(cid) then return true end
	local item = 460
	local text = ""
	if type(p1) == "string" then
		doShowTextDialog(cid, item, p1)
	else
		doShowTextDialog(cid, p1, p2)
	end
end

function getClockString(tw)
	local a = getWorldTime()
	local b = a / 60
	local hours = math.floor(b)
	local minut = a - (60 * hours)

	if not tw then
		if hours < 10 then
			hours = "0"..hours..""
		end
		if minut < 10 then
			minut = "0"..minut..""
		end
	return hours..":"..minut
	else
		local sm = "a.m"
		if hours >= 12 then
			hours = hours - 12
			sm = "p.m"
		end
		if hours < 10 then
			hours = "0"..hours..""
		end
		if minut < 10 then
			minut = "0"..minut..""
		end
	return hours..":"..minut.." "..sm
	end
end

function doCorrectPokemonName(poke)
return doCorrectString(poke)
end

function doCorrectString(str)
local name = str:explode(" ")  --alterado v1.9
local final = {}
for _, s in ipairs(name) do
    table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower())
end
return table.concat(final, (name[2] and " " or ""))
end   

function getHappinessRate(cid)
	if not isCreature(cid) then return 1 end
	local a = getPlayerStorageValue(cid, 1008)
		if a == -1 then return 1 end
	if a >= getConfigValue('PokemonStageVeryHappy') then
		return happinessRate[5].rate
	elseif a >= getConfigValue('PokemonStageHappy') then
		return happinessRate[4].rate
	elseif a >= getConfigValue('PokemonStageOK') then
		return happinessRate[3].rate
	elseif a >= getConfigValue('PokemonStageSad') then
		return happinessRate[2].rate
	else
		return happinessRate[1].rate
	end
return 1
end

function doBodyPush(cid, target, go, pos)
	if not isCreature(cid) or not isCreature(target) then
		doRegainSpeed(cid)
		doRegainSpeed(target)
	return true
	end
		if go then
			local a = getThingPos(cid)
			doChangeSpeed(cid, -getCreatureSpeed(cid))
				if not isPlayer(target) then
					doChangeSpeed(target, -getCreatureSpeed(target))
				end
			doChangeSpeed(cid, 800)
			doTeleportThing(cid, getThingPos(target))
			doChangeSpeed(cid, -800)
			addEvent(doBodyPush, 350, cid, target, false, a)
		else
			doChangeSpeed(cid, 800)
			doTeleportThing(cid, pos)
			doRegainSpeed(cid)
			doRegainSpeed(target)
		end
end

function doReturnPokemon(cid, pokemon, pokeball, effect, hideeffects, blockevo)

    --////////////////////////////////////////////////////////////////////////////////////////--
	checkDuel(cid)                                                                      --alterado v1.6 duel system
    --////////////////////////////////////////////////////////////////////////////////////////--
    if getPlayerStorageValue(cid, 52480) >= 1 and getPlayerStorageValue(cid, 52484) ~= 10 then
       return sendMsgToPlayer(cid, 27, "You can't do that while the duel don't begins!")        --alterado v1.8
    end
    --////////////////////////////////////////////////////////////////////////////////////////--
    
    if #getCreatureSummons(cid) > 1 and getPlayerStorageValue(cid, 212124) <= 0 then     --alterado v1.6
       if getPlayerStorageValue(cid, 637501) == -2 or getPlayerStorageValue(cid, 637501) >= 1 then  
          BackTeam(cid)       
       end
    end
    -----------------
	local edit = true

	if not pokeball then
		pokeball = getPlayerSlotItem(cid, 8)
	end

	if blockevo then
		edit = false
		doPlayerSendCancel(cid, "Your pokemon couldn't evolve due to server mistakes, please wait until we fix the problem.")
	end

	local happy = getPlayerStorageValue(pokemon, 1008)
	local hunger = getPlayerStorageValue(pokemon, 1009)
	local pokelife = (getCreatureHealth(pokemon) / getCreatureMaxHealth(pokemon))

	if edit then
		doItemSetAttribute(pokeball.uid, "happy", happy)
		doItemSetAttribute(pokeball.uid, "hunger", hunger)
		doItemSetAttribute(pokeball.uid, "hp", pokelife)
	end

--	if getCreatureName(pokemon) == "Ditto" then
--		if isTransformed(pokemon) then
	--		local left = getItemAttribute(pokeball.uid, "transLeft") - (os.clock() - getItemAttribute(pokeball.uid, "transBegin"))
	--		doItemSetAttribute(pokeball.uid, "transLeft", left)
	--	end
--	end

	if hideeffects then
		doRemoveCreature(pokemon)
	return true
	end

	local pokename = getPokeName(pokemon)

	local mbk = gobackmsgs[math.random(1, #gobackmsgs)].back:gsub("doka", pokename)

	if getCreatureCondition(cid, CONDITION_INFIGHT) then
		if isCreature(getCreatureTarget(cid)) then
			doItemSetAttribute(pokeball.uid, "happy", happy - 5)
		else
			doItemSetAttribute(pokeball.uid, "happy", happy - 2)
		end
	end

	doTransformItem(pokeball.uid, pokeball.itemid-1)
	doCreatureSay(cid, mbk, 19)

	doSendMagicEffect(getCreaturePosition(pokemon), effect)

	doRemoveCreature(pokemon)

    unLock(pokeball.uid) --alterado v1.8
    
    if useOTClient then
       doPlayerSendCancel(cid, '12//,hide')  --alterado v1.7
    end
    
	if useKpdoDlls then
		doUpdateMoves(cid)
	end

end

local EFFECTS = {
	--[OutfitID] = {Effect}
	["Magmar"] = 35,                --alterado v1.5
	["Shiny Magmar"] = 35,
	["Magby"] = 35,
	["Jynx"] = 17,   
	["Smoochum"] = 17, 
	["Shiny Jynx"] = 17,    
	["Piloswine"] = 205,  --alterado v1.8
    ["Swinub"] = 205, 
    ["Stantler"] = 205, 
    ["Shiny Stantler"] = 205, 
}

function doGoPokemon(cid, item)

	if getPlayerStorageValue(cid, 17000) >= 1 or getPlayerStorageValue(cid, 17001) >= 1 or getPlayerStorageValue(cid, 63215) >= 1 then
	return true
	end
---------------------------------------------------------------
local ballName = getItemAttribute(item.uid, "poke")

   btype = getPokeballType(item.itemid)                   

	local effect = pokeballs[btype].effect
		if not effect then
			effect = 21
		end
-----------------------------------------------------------------
	if item.uid ~= getPlayerSlotItem(cid, CONST_SLOT_FEET).uid then
		doPlayerSendCancel(cid, "You must put your pokeball in the correct place!")
	return TRUE
	end

	local thishp = getItemAttribute(item.uid, "hp")

	if thishp <= 0 then
		if isInArray(pokeballs[btype].all, item.itemid) then
			doTransformItem(item.uid, pokeballs[btype].off)
			doItemSetAttribute(item.uid, "hp", 0)
			doPlayerSendCancel(cid, "This pokemon is fainted.")
		    return true
		end
	end

	local pokemon = getItemAttribute(item.uid, "poke")

	if not pokes[pokemon] then
	return true
	end

----------------------- Sistema de nao poder carregar mais que 3 pokes lvl baixo e + q 1 poke de lvl medio/alto ---------------------------------
if not isInArray({5, 6}, getPlayerGroupId(cid)) then
   local balls = getPokeballsInContainer(getPlayerSlotItem(cid, 3).uid)      --alterado v1.9 \/
   local low = {}
   local lowPokes = {"Rattata", "Caterpie", "Weedle", "Oddish", "Pidgey", "Paras", "Poliwag", "Bellsprout", "Magikarp", "Hoppip", "Sunkern"}
   if #balls >= 1 then
      for _, uid in ipairs(balls) do
          local nome = getItemAttribute(uid, "poke")
          if not isInArray(lowPokes, pokemon) and nome == pokemon then
             return doPlayerSendTextMessage(cid, 27, "Sorry, but you can't carry two pokemons equals!")
          else
             if nome == pokemon then
                table.insert(low, nome)
             end
          end
      end
   end
if #low >= 3 then
   return doPlayerSendTextMessage(cid, 27, "Sorry, but you can't carry more than three pokemons equals of low level!")
end   
end
---------------------------------------------------------------------------------------------------------------------------------------------------

	local x = pokes[pokemon]
	local boosts = getItemAttribute(item.uid, "boost") or 0

	if getPlayerLevel(cid) < (x.level + boosts) then   --alterado v1.8 \/
	doPlayerSendCancel(cid, "You need level "..(x.level + boosts).." to use this pokemon.")
	return true
	end
	
	--------------------------------------------------------------------------------------
	shinysClan = {
	["Shiny Fearow"] = {4, "Wingeon"},
	["Shiny Flareon"] = {1, "Volcanic"},
	["Shiny Vaporeon"] = {2, "Seavel"}, 
	["Shiny Jolteon"] = {9, "Raibolt"},
	["Shiny Hypno"] = {7, "Psycraft"},
	["Shiny Golem"] = {3, "Orebound"},         
	["Shiny Vileplume"] = {8, "Naturia"},
	["Shiny Nidoking"] = {5, "Malefic"},
	["Shiny Hitmontop"] = {6, "Gardestrike"},   
	["Shiny Metagross"] = {9, "Ironhead"},
	}
	
	if shinysClan[pokemon] and (getPlayerGroupId(cid) < 4 or getPlayerGroupId(cid) > 6) then --alterado v1.9
	   if getPlayerStorageValue(cid, 86228) ~= shinysClan[pokemon][1] then
	      doPlayerSendCancel(cid, "You need be a member of the clan "..shinysClan[pokemon][2].." to use this pokemon!")
	      return true   
       elseif getPlayerStorageValue(cid, 862281) ~= 5 then
          doPlayerSendCancel(cid, "You need be atleast rank 5 to use this pokemon!")
	      return true
       end
    end
    --------------------------------------------------------------------------------------

	doSummonMonster(cid, pokemon)

	local pk = getCreatureSummons(cid)[1]
	if not isCreature(pk) then return true end
	
	------------------------passiva hitmonchan------------------------------
	if isSummon(pk) then                                                  --alterado v1.8 \/
       if pokemon == "Shiny Hitmonchan" or pokemon == "Hitmonchan" then
          if not getItemAttribute(item.uid, "hands") then
             doSetItemAttribute(item.uid, "hands", 0)
          end
          local hands = getItemAttribute(item.uid, "hands")
          doSetCreatureOutfit(pk, {lookType = hitmonchans[pokemon][hands].out}, -1)
       end
    end
	-------------------------------------------------------------------------
    ---------movement magmar, jynx-------------
    if EFFECTS[getCreatureName(pk)] then     
       markPosEff(pk, getThingPos(pk))
       sendMovementEffect(pk, EFFECTS[getCreatureName(pk)], getThingPos(pk))   
    end
    --------------------------------------------------------------------------  

	if getCreatureName(pk) == "Ditto" then

		local left = getItemAttribute(item.uid, "transLeft")
		local name = getItemAttribute(item.uid, "transName")

		if left and left > 0 then
			setPlayerStorageValue(pk, 1010, name)
			doSetCreatureOutfit(pk, {lookType = getItemAttribute(item.uid, "transOutfit")}, -1)
			addEvent(deTransform, left * 1000, pk, getItemAttribute(item.uid, "transTurn"))
			doItemSetAttribute(item.uid, "transBegin", os.clock())
		else
			setPlayerStorageValue(pk, 1010, "Ditto")
		end
	end

	if isGhostPokemon(pk) then doTeleportThing(pk, getPosByDir(getThingPos(cid), math.random(0, 7)), false) end

	doCreatureSetLookDir(pk, 2)

	adjustStatus(pk, item.uid, true, true, true)
	doAddPokemonInOwnList(cid, pokemon)

	doTransformItem(item.uid, item.itemid+1)

	local pokename = getPokeName(pk) --alterado v1.7

	local mgo = gobackmsgs[math.random(1, #gobackmsgs)].go:gsub("doka", pokename)
	doCreatureSay(cid, mgo, TALKTYPE_SAY)

	doSendMagicEffect(getCreaturePosition(pk), effect)

    unLock(item.uid) --alterado v1.8

	
local pk = getCreatureSummons(cid)[1]
local pb = getPlayerSlotItem(cid, 8).uid
local look = getItemAttribute(pb,"addon")
if not look then
doSetItemAttribute(pb,"addon",0)

end
if look > 0 then
doSetCreatureOutfit(pk, {lookType = look}, -1)

end	
	if useKpdoDlls then
		doUpdateMoves(cid)
	end
end

function doRegainSpeed(cid)              --alterado v1.9 \/
if not isCreature(cid) then return true end

   local speed = PlayerSpeed
   if isMonster(cid) then
      speed = getSpeed(cid)
   elseif isPlayer(cid) and isInArray({4, 5, 6}, getPlayerGroupId(cid)) then
      speed = 200*getPlayerGroupId(cid) 
   end
   
   doChangeSpeed(cid, -getCreatureSpeed(cid))
   if getCreatureCondition(cid, CONDITION_PARALYZE) == true then
      doRemoveCondition(cid, CONDITION_PARALYZE)
      addEvent(doAddCondition, 10, cid, paralizeArea2)             
   end
    
doChangeSpeed(cid, speed)
return speed
end

function isPosEqualPos(pos1, pos2, checkstackpos)
	if pos1.x ~= pos2.x or pos1.y ~= pos2.y and pos1.z ~= pos2.z then
	return false
	end
	if checkstackpos and pos1.stackpos and pos2.stackpos and pos1.stackpos ~= pos2.stackpos then
	return false
	end
return true
end

function getRandomGenderByName(name)
local rate = newpokedex[name]
	if not rate then return 0 end
	rate = rate.gender
	if rate == 0 then
		gender = 3
	elseif rate == 1000 then
		gender = 4
	elseif rate == -1 then
		gender = 0
	elseif math.random(1, 1000) <= rate then
		gender = 4
	else
		gender = 3
	end
return gender
end

function getRecorderCreature(pos, cid)
	local ret = 0
	if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
	   return cid
	end
	local s = {}
	s.x = pos.x
	s.y = pos.y
	s.z = pos.z
		for a = 0, 255 do
			s.stackpos = a
			local b = getTileThingByPos(s).uid
			if b > 1 and isCreature(b) and getCreatureOutfit(b).lookType ~= 814 then
				ret = b
			end
		end
return ret
end

function doCreatureSetOutfit(cid, outfit, time)
	doSetCreatureOutfit(cid, outfit, time)
end

function doMagicalFlower(cid, away)
	if not isCreature(cid) then return true end
	for x = -3, 3 do
		for y = -3, 3 do
		local a = getThingPos(cid)
		a.x = a.x + x
		a.y = a.y + y
			if away then
				doSendDistanceShoot(a, getThingPos(cid), 21)
			else
				doSendDistanceShoot(getThingPos(cid), a, 21)
			end
		end
	end
end		

function isItemPokeball(item)         --alterado v1.9 \/
if not item then return false end
for a, b in pairs (pokeballs) do
	if isInArray(b.all, item) then return true end
	if item >= 12861 and item <= 13781 then
	return true
	end
	if item >= 13797 and item <= 13823 then
	return true
	end
        if item >= 10975 and item <= 10977 then
        return true
	end
	if item >= 13836 and item <= 13850 then
	return true
	end
	if item >= 13851 and item <= 13856 then
	return true
	end
	if item >= 13859 and item <= 13861 then
	return true
	end
	if item >= 13902 and item <= 13904 then
	return true
	end
	if item >= 13919 and item <= 13930 then
	return true
	end
end
return false
end

function isPokeball(item)
if not item then return false end
for a, b in pairs (pokeballs) do
	if isInArray(b.all, item) then return true end
	if item >= 12861 and item <= 13781 then
	return true
	end
	if item >= 13797 and item <= 13823 then
	return true
	end
        if item >= 10975 and item <= 10977 then
        return true
	end
	if item >= 13836 and item <= 13856 then
	return true
	end
end
return false
end
function getPokeballType(id)
	for a, b in pairs (pokeballs) do
		if isInArray(b.all, id) then
			return a
		end
	end
return "none"
end

randomdiagonaldir = {
[NORTHEAST] = {NORTH, EAST},
[SOUTHEAST] = {SOUTH, EAST},
[NORTHWEST] = {NORTH, WEST},
[SOUTHWEST] = {SOUTH, WEST}}

function doFaceOpposite(cid)
local a = getCreatureLookDir(cid)
local d = {
[NORTH] = SOUTH,
[SOUTH] = NORTH,
[EAST] = WEST,
[WEST] = EAST,
[NORTHEAST] = SOUTHWEST,
[NORTHWEST] = SOUTHEAST,
[SOUTHEAST] = NORTHWEST,
[SOUTHWEST] = NORTHEAST}
doCreatureSetLookDir(cid, d[a])
end

function doFaceRandom(cid)
local a = getCreatureLookDir(cid)
local d = {
[NORTH] = {SOUTH, WEST, EAST},
[SOUTH] = {NORTH, WEST, EAST},
[WEST] = {SOUTH, NORTH, EAST},
[EAST] = {SOUTH, WEST, NORTH}}
doChangeSpeed(cid, 1)
doCreatureSetLookDir(cid, d[a][math.random(1, 3)])
doChangeSpeed(cid, -1)
end

function getFaceOpposite(dir)
local d = {
[NORTH] = SOUTH,
[SOUTH] = NORTH,
[EAST] = WEST,
[WEST] = EAST,
[NORTHEAST] = SOUTHWEST,
[NORTHWEST] = SOUTHEAST,
[SOUTHEAST] = NORTHWEST,
[SOUTHWEST] = NORTHEAST}
return d[dir]
end

function getResistance(cid, combat)
	if isPlayer(cid) then return false end
local poketype1 = pokes[getCreatureName(cid)].type
local poketype2 = pokes[getCreatureName(cid)].type2
local multiplier = 1
	if effectiveness[combat].super and isInArray(effectiveness[combat].super, poketype1) then
		multiplier = multiplier * 2
	end
	if poketype2 and effectiveness[combat].super and isInArray(effectiveness[combat].super, poketype2) then
		multiplier = multiplier * 2
	end
	if effectiveness[combat].weak and isInArray(effectiveness[combat].weak, poketype1) then
		multiplier = multiplier * 0.5
	end
	if poketype2 and effectiveness[combat].weak and isInArray(effectiveness[combat].weak, poketype2) then
		multiplier = multiplier * 0.5
	end
	if effectiveness[combat].non and isInArray(effectiveness[combat].non, poketype1) then
		multiplier = multiplier * 0
	end
	if poketype2 and effectiveness[combat].non and isInArray(effectiveness[combat].non, poketype2) then
		multiplier = multiplier * 0
	end

	if multiplier == 0.25 then
		multiplier = 0.5
	elseif multiplier == 4 then
		multiplier = 2
	end

return multiplier
end

function getCreatureDirectionToTarget(cid, target, ranged)
	if not isCreature(cid) then return true end
	if not isCreature(target) then return getCreatureLookDir(cid) end
	local dirs = {
	[NORTHEAST] = {NORTH, EAST},
	[SOUTHEAST] = {SOUTH, EAST},
	[NORTHWEST] = {NORTH, WEST},
	[SOUTHWEST] = {SOUTH, WEST}}
	local x = getDirectionTo(getThingPos(cid), getThingPos(target), false)
		if x <= 3 then return x
		else
			local xdistance = math.abs(getThingPos(cid).x - getThingPos(target).x)
			local ydistance = math.abs(getThingPos(cid).y - getThingPos(target).y)
				if xdistance > ydistance then
					return dirs[x][2]
				elseif ydistance > xdistance then
					return dirs[x][1]
				elseif isInArray(dirs[x], getCreatureLookDir(cid)) then
					return getCreatureLookDir(cid)
				else
					return dirs[x][math.random(1, 2)]
				end
		end
end

function getSomeoneDescription(cid)
	if isPlayer(cid) then return getPlayerNameDescription(cid) end
return getMonsterInfo(getCreatureName(cid)).description
end
	

function isGhostPokemon(cid)
	if not isCreature(cid) then return false end
	local ghosts = {"Gastly", "Haunter", "Gengar", "Shiny Gengar", "Misdreavus", "Shiny Abra"}
return isInArray(ghosts, getCreatureName(cid))
end

function updateGhostWalk(cid)
	if not isCreature(cid) then return false end
	local pos = getThingPos(cid)
	pos.x = pos.x + 1
	pos.y = pos.y + 1
	local ret = getThingPos(cid)
	doTeleportThing(cid, pos, false)
	doTeleportThing(cid, ret, false)
return true
end

function doRemoveElementFromTable(t, e)
	local ret = {}
	for a = 1, #t do
		if t[a] ~= e then
		table.insert(ret, t[a])
		end
	end
return ret
end

function doFaceCreature(sid, pos)
if not isCreature(sid) then return true end
	if getThingPos(sid).x == pos.x and getThingPos(sid).y == pos.y then return true end
	local ret = 0

	local ld = getCreatureLookDir(sid)
	local dir = getDirectionTo(getThingPos(sid), pos)
	local al = {
	[NORTHEAST] = {NORTH, EAST},
	[NORTHWEST] = {NORTH, WEST},
	[SOUTHEAST] = {SOUTH, EAST},
	[SOUTHWEST] = {SOUTH, WEST}}

	if dir >= 4 and isInArray(al[dir], ld) then return true end

	doChangeSpeed(sid, 1)
		if dir == 4 then
			ret = math.random(2, 3)
		elseif dir == 5 then
			ret = math.random(1, 2)
		elseif dir == 6 then
			local dirs = {0, 3}
			ret = dirs[math.random(1, 2)]
		elseif dir == 7 then
			ret = math.random(0, 1)
		else
			ret = getDirectionTo(getThingPos(sid), pos)
		end
doCreatureSetLookDir(sid, ret)
doChangeSpeed(sid, -1)
return true
end

function doCreatureAddCondition(cid, condition)
if not isCreature(cid) then return true end
doAddCondition(cid, condition)
end

function doCreatureRemoveCondition(cid, condition)
if not isCreature(cid) then return true end
doRemoveCondition(cid, condition)
end

function setCD(item, tipo, tempo)

	if not tempo or not tonumber(tempo) then
		doItemEraseAttribute(item, tipo)
	return true
	end

	doItemSetAttribute(item, tipo, "cd:"..(tempo + os.time()).."")
return tempo + os.time()
end

function getCD(item, tipo, limite)

	if not getItemAttribute(item, tipo) then
	return 0
	end

	local string = getItemAttribute(item, tipo):gsub("cd:", "")
	local number = tonumber(string) - os.time()

	if number <= 0 then
	return 0
	end

	if limite and limite < number then
		return 0
	end

return number
end

function doSendMoveEffect(cid, target, effect)
if not isCreature(cid) or not isCreature(target) then return true end
doSendDistanceShoot(getThingPos(cid), getThingPos(target), effect)
return true
end

function doSetItemActionId(uid, actionid)
doItemSetAttribute(uid, "aid", actionid)
return true
end

function threeNumbers(number)
	if number <= 9 then
	return "00"..number..""
	elseif number <= 99 then
	return "0"..number..""
	end
return ""..number..""
end

function isBr(cid)
if getPlayerStorageValue(cid, 105505) ~= -1 then
return true
end
return false
end

function isBeingUsed(ball)            
if not ball then return false end
for a, b in pairs (pokeballs) do           --alterado v1.9
    if b.use == ball then return true end
end
return false
end

function doRemoveTile(pos)-- Script by mock
pos.stackpos = 0
local sqm = getTileThingByPos(pos)
doRemoveItem(sqm.uid,1)
end

function doCreateTile(id,pos) -- By mock
doAreaCombatHealth(0,0,pos,0,0,0,CONST_ME_NONE)
doCreateItem(id,1,pos)
end

function hasSqm(pos)
local f = getTileThingByPos(pos)
if f.itemid ~= 0 and f.itemid ~= 1 then
return true
end
return false
end

function getPosDirs(p, dir) -- By MatheusMkalo
return dir == 1 and {x=p.x-1, y=p.y, z=p.z} or dir == 2 and {x=p.x-1, y=p.y+1, z=p.z} or dir == 3 and {x=p.x, y=p.y+1, z=p.z} or dir == 4 and {x=p.x+1, y=p.y+1, z=p.z} or dir == 5 and {x=p.x+1, y=p.y, z=p.z} or dir == 6 and {x=p.x+1, y=p.y-1, z=p.z} or dir == 7 and {x=p.x, y=p.y-1, z=p.z} or dir == 8 and {x=p.x-1, y=p.y-1, z=p.z}
end

function canWalkOnPos(pos, creature, pz, water, sqm, proj)
if not pos then return false end
if not pos.x then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid <= 1 and sqm then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 919 then return false end
if isInArray({4820, 4821, 4822, 4823, 4824, 4825}, getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false end
    local n = not proj and 3 or 2                                    --alterado v1.6
    for i = 0, 255 do
        pos.stackpos = i                           
        local tile = getTileThingByPos(pos)        
        if tile.itemid ~= 0 and i ~= 253 and not isCreature(tile.uid) then     --edited
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end   
return true
end

function canWalkOnPos2(pos, creature, pz, water, sqm, proj)     --alterado v1.6
if not pos then return false end
if not pos.x then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid <= 1 and sqm then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 919 then return false end
if isInArray({4820, 4821, 4822, 4823, 4824, 4825}, getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false end
    --[[local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i                           --edited pra retirar um bug.. ;x
        local tile = getTileThingByPos(pos)        
        if tile.itemid ~= 0 and i ~= 253 and not isCreature(tile.uid) then     --edited
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end ]]  
return true
end

function getFreeTile(pos, cid)
	if canWalkOnPos(pos, true, false, true, true, false) then
		return pos
	end
	local positions = {}
	for a = 0, 7 do
		if canWalkOnPos(getPosByDir(pos, a), true, false, true, true, false) then
		table.insert(positions, pos)
		end
	end
	if #positions >= 1 then
		if isCreature(cid) then
			local range = 1000
			local ret = getThingPos(cid)
			for b = 1, #positions do
				if getDistanceBetween(getThingPos(cid), positions[b]) < range then
					ret = positions[b]
					range = getDistanceBetween(getThingPos(cid), positions[b])
				end
			end
			return ret
		else
			return positions[math.random(#positions)]
		end
	end
return getThingPos(cid)
end

function isWalkable(pos, creature, proj, pz, water)-- by Nord
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
    if getTopCreature(pos).uid > 0 and creature then return false end
    if getTileInfo(pos).protection and pz then return false, true end
    local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i
        local tile = getTileThingByPos(pos)
        if tile.itemid ~= 0 and not isCreature(tile.uid) then
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end
    return true
end


function isPlayerSummon(cid, uid)
return getCreatureMaster(uid) == cid  --alterado v1.9
end

function isSummon(sid)
return isCreature(sid) and getCreatureMaster(sid) ~= sid and isPlayer(getCreatureMaster(sid))   --alterado v1.9
end 

function getItemsInContainerById(container, itemid) -- Function By Kydrai
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
   for slot=0, (getContainerSize(container)-1) do
       local item = getContainerItem(container, slot)
       if isContainer(item.uid) then
          local itemsbag = getItemsInContainerById(item.uid, itemid)
          for i=0, #itemsbag do
              table.insert(items, itemsbag[i])
          end
       else
          if itemid == item.itemid then
             table.insert(items, item.uid)
          end
       end
   end
end
return items
end

function getPokeballsInContainer(container) -- Function By Kydrai
	if not isContainer(container) then return {} end
	local items = {}
	if isContainer(container) and getContainerSize(container) > 0 then
		for slot=0, (getContainerSize(container)-1) do
			local item = getContainerItem(container, slot)
				if isContainer(item.uid) then
					local itemsbag = getPokeballsInContainer(item.uid)
					for i=0, #itemsbag do
						table.insert(items, itemsbag[i])
					end
				elseif isPokeball(item.itemid) then
					table.insert(items, item.uid)
				end
		end
	end
return items
end

function getItensUniquesInContainer(container)    --alterado v1.6
if not isContainer(container) then return {} end
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
   for slot=0, (getContainerSize(container)-1) do
       local item = getContainerItem(container, slot)
       if isContainer(item.uid) then
          local itemsbag = getItensUniquesInContainer(item.uid)
          for i=0, #itemsbag do
	          table.insert(items, itemsbag[i])
          end
       elseif getItemAttribute(item.uid, "unique") then
          table.insert(items, item)
       end
   end
end
return items
end

function hasSpaceInContainer(container)                --alterado v1.6
if not isContainer(container) then return false end
if getContainerSize(container) < getContainerCap(container) then return true end

for slot = 0, (getContainerSize(container)-1) do
    local item = getContainerItem(container, slot)
    if isContainer(item.uid) then
       if hasSpaceInContainer(item.uid) then
          return true
       end
    end
end
return false
end

function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo
local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
   for i,x in pairs(item) do
       if getThing(x).type < 100 then
          local it = getThing(x)
          doTransformItem(it.uid, itemid, it.type+quant)
          if it.type+quant > 100 then
             doPlayerAddItem(cid, itemid, it.type+quant-100)
          end
       else
          piles = piles+1
       end
   end
else
   return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
   doPlayerAddItem(cid, itemid, quant)
end
end

function getPlayerInArea(fromPos, toPos) -- by jhon992
local online = getPlayersOnline()
local players = {}
for i=1, #online do
    if isInArea(getPlayerPosition(online[i]), fromPos, toPos) then
        players[#players+1] = online[i]
    end
end
return players
end
function isPlayerOnline(uid)
	return isInArray(getPlayersOnline(), uid)
end

function doRegenerateWithY(cid, sid)
if isPlayerOnline(cid) then
local ball = getPlayerSlotItem(cid, 8) or getPlayerSlotItem(getCreatureMaster(cid), 8)
local Tiers = {
[1] = {bonus = Regen1},
[2] = {bonus = Regen2},
[3] = {bonus = Regen3},
[4] = {bonus = Regen4},
[5] = {bonus = Regen5},
[6] = {bonus = Regen6},
[7] = {bonus = Regen7},
}
if isPlayer(cid) and #getCreatureSummons(cid) > 0 then
local Tier = getItemAttribute(ball.uid, "heldy")
if Tier and Tier > 0 and Tier < 8 then
if not getCreatureCondition(cid, CONDITION_INFIGHT) then
if getCreatureHealth(sid) < getCreatureMaxHealth(sid) then
addEvent(function() doCreatureAddHealth(sid,Tiers[Tier].bonus) doSendAnimatedText(getThingPos(sid), "+ "..Tiers[Tier].bonus, 30) end, 0)
end
addEvent(doRegenerateWithY, 1000, cid, sid)  
else
addEvent(doRegenerateWithY, 1000, cid, sid)
end
end   
end
end 
end

function doCureWithY(cid, sid)
if isPlayerOnline(cid) then
local ball = getPlayerSlotItem(cid, 8) or getPlayerSlotItem(getCreatureMaster(cid), 8)
local Tiers = {
[8] = {chance = Cure1},
[9] = {chance = Cure2},
[10] = {chance = Cure3},
[11] = {chance = Cure4},
[12] = {chance = Cure5},
[13] = {chance = Cure6},
[14] = {chance = Cure7},
}
local Tier = getItemAttribute(ball.uid, "heldy")
if isPlayer(cid) and #getCreatureSummons(cid) > 0  and Tier then
if Tier > 7 and Tier < 15 then
if math.random(1,100) <= Tiers[Tier].chance then
doCureStatus(sid, "all")
doSendMagicEffect(getThingPosWithDebug(sid), 14)
end
addEvent(doCureWithY, 1000, cid, sid)  
end
end
end   
end
function doPlayerAddItemStacking(cid, itemid, quant)


local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
for i,x in pairs(item) do
if getThing(x).type < 100 then
local it = getThing(x)
doTransformItem(it.uid, itemid, it.type+quant)
if it.type+quant > 100 then
doPlayerAddItem(cid, itemid, it.type+quant-100)
end
else
piles = piles+1
end
break
end
else
return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
doPlayerAddItem(cid, itemid, quant)
end
end

function getDirectionToWalk(p1, pos2)
	local dir = NORTH
	local pos1 = getCreaturePosition(p1)
	if(pos1.x > pos2.x) then
		dir = WEST
		if(pos1.y > pos2.y) then
			dir = NORTHWEST
		elseif(pos1.y < pos2.y) then
			dir = SOUTHWEST
		end
	elseif(pos1.x < pos2.x) then
		dir = EAST
		if(pos1.y > pos2.y) then
			dir = NORTHEAST
		elseif(pos1.y < pos2.y) then
			dir = SOUTHEAST
		end
	else
		if(pos1.y > pos2.y) then
			dir = NORTH
		elseif(pos1.y < pos2.y) then
			dir = SOUTH
		end
	end
	return dir
end

 function getNextStepDelay(cid, dir)
            return tonumber(398)
    end	  
	
	
	function getRecorderPlayer(pos, cid)
	local ret = 0
	if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
	   return cid
	end
	local s = {}
	s.x = pos.x
	s.y = pos.y
	s.z = pos.z
		for a = 0, 255 do
			s.stackpos = a
			local b = getTileThingByPos(s).uid
			if b > 1 and isPlayer(b) and getCreatureOutfit(b).lookType ~= 814 then
				ret = b
			end
		end
return ret
end

function getRecorderCreature(pos, cid)
	local ret = 0
	if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
	   return cid
	end
	local s = {}
	s.x = pos.x
	s.y = pos.y
	s.z = pos.z
		for a = 0, 255 do
			s.stackpos = a
			local b = getTileThingByPos(s).uid
			if b > 1 and isCreature(b) and getCreatureOutfit(b).lookType ~= 814 then
				ret = b
			end
		end
return ret
end

function hasTile(pos)    --Verifica se tem TILE na pos
pos.stackpos = 0
if getTileThingByPos(pos).itemid >= 1 then
   return true
end
return false
end
function doPlayerAddItemStacking(cid, itemid, quant)


local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
for i,x in pairs(item) do
if getThing(x).type < 100 then
local it = getThing(x)
doTransformItem(it.uid, itemid, it.type+quant)
if it.type+quant > 100 then
doPlayerAddItem(cid, itemid, it.type+quant-100)
end
else
piles = piles+1
end
break
end
else
return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
doPlayerAddItem(cid, itemid, quant)
end
end

function isFly(cid)
   if getPlayerStorageValue(cid, orderTalks["fly"].storage) == 1 then
      return true 
   end
   return false
end


function doOTCSendPokemonHealth(cid)
	local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET)
	local pokemon = getCreatureSummons(cid)
	if not ball.uid or ball.uid <= 1 then
		return doSendPlayerExtendedOpcode(cid, 122, "0|0")
	end
	if #pokemon >= 1 then
		return doSendPlayerExtendedOpcode(cid, 122, getCreatureHealth(pokemon[1]).."|"..getCreatureMaxHealth(pokemon[1]))
	end
end

some functions.lua /\

Link para o comentário
Compartilhar em outros sites

  • 0
5 minutos atrás, BrunooMaciell disse:

function getStringOfTaskArray(array)
   if type(array) ~= 'table' or not next(array) then return "" end
   
   local result = {}
    for _, value in ipairs(array) do
	    local thing, num = (type(value[1]) == 'string' and value[1] or getItemNameById(value[1])), value[2]
		table.insert(result, (_ == 1 and "" or ", ")..num.." "..thing..(num == 1 and "" or "s"))
    end
	result[#result] = " and"..(result[#result]:sub(2,#result[#result]))
	return table.concat(result)
end

function getVitalityByMaster(cid)
if not isCreature(cid) then return 0 end
local ball = getPlayerSlotItem(cid, 8).uid
if not ball or ball <= 1 or not pokes[getItemAttribute(ball, 'poke')] then return true end
   return pokes[getItemAttribute(ball, 'poke')].vitality * (getPlayerLevel(cid) + (getItemAttribute(ball, 'boost') or 0))
end

function onPokeHealthChange(cid, zerar)
   if not isCreature(cid) then return true end
   if zerar then doPlayerSendCancel(cid, '#ph#,0,0') end
   local ball = getPlayerSlotItem(cid, 8).uid
   if not ball or ball <= 1 or not pokes[getItemAttribute(ball, 'poke')] then return true end
   
   if #getCreatureSummons(cid) >= 1 and getPlayerStorageValue(cid, 212124) <= 0 then   --alterado v1.6
      local pokemon = getCreatureSummons(cid)[1]
      local pokelife = (getCreatureHealth(pokemon) / getCreatureMaxHealth(pokemon))
      doItemSetAttribute(ball, "hp", pokelife)
   end
   
      local rd = 1 - (tonumber(getItemAttribute(ball, "hp")))
   local maxHp = HPperVITsummon * getVitalityByMaster(cid) 
   local hp = maxHp -(maxHp * rd)   
   doPlayerSendCancel(cid, '#ph#,'.. math.floor(hp) ..','.. math.floor(maxHp))
end

function addPokeToPlayer(cid, pokemon, boost, gender, ball)             --alterado v1.9 \/ peguem ele todo...
local genders = {
["male"] = 4,
["female"] = 3,
[1] = 4,
[0] = 3,
[4] = 4,
[3] = 3,
}
if not isCreature(cid) then return false end

local pokemon = doCorrectString(pokemon)
if not pokes[pokemon] then return false end

   local GENDER = (gender and genders[gender]) and genders[gender] or getRandomGenderByName(pokemon)
   local btype = (ball and pokeballs[ball]) and ball or isShinyName(pokemon) and "shinynormal" or "normal"
   local happy = 250
   
   if icons[pokemon] then
      id = icons[pokemon].on
   else
      id = pokeballs[btype].on
   end

   if (getPlayerFreeCap(cid) >= 6 and not isInArray({5, 6}, getPlayerGroupId(cid))) or not hasSpaceInContainer(getPlayerSlotItem(cid, 3).uid) then 
      item = doCreateItemEx(id)
   else
      item = addItemInFreeBag(getPlayerSlotItem(cid, 3).uid, id, 1)   
   end
   if not item then return false end

   doItemSetAttribute(item, "poke", pokemon)
   doItemSetAttribute(item, "hp", 1)
   doItemSetAttribute(item, "happy", happy)
   --doItemSetAttribute(item, "-1", GENDER)
   doSetItemAttribute(item, "hands", 0)
   doItemSetAttribute(item, "description", "Contains a "..pokemon..".")
   doItemSetAttribute(item, "fakedesc", "Contains a "..pokemon..".") 
   doItemSetAttribute(item, "defeated", "no")
   doItemSetAttribute(item, "ball", btype)
   doItemSetAttribute(item, "tadport", fotos[pokemon])
   if boost and tonumber(boost) and tonumber(boost) > 0 and tonumber(boost) <= 50 then
      doItemSetAttribute(item, "boost", boost)
   end
   if unique then
      doItemSetAttribute(item, "unique", getCreatureName(cid))
   end
                                                                             
   if (getPlayerFreeCap(cid) >= 6 and not isInArray({5, 6}, getPlayerGroupId(cid))) or not hasSpaceInContainer(getPlayerSlotItem(cid, 3).uid) then
      doPlayerSendMailByName(getCreatureName(cid), item, 1)
      sendMsgToPlayer(cid, 27, "You are already holding six pokemons, so your new pokemon was sent to your depot.")
   end
   doTransformItem(item, id)
return true
end 
---------------------------

function unLock(ball)                                                             
if not ball or ball <= 0 then return false end
if getItemAttribute(ball, "lock") and getItemAttribute(ball, "lock") > 0 then
   local vipTime = getItemAttribute(ball, "lock")
   local timeNow = os.time()
   local days = math.ceil((vipTime - timeNow)/(24 * 60 * 60))
   if days <= 0 then
      doItemEraseAttribute(ball, "lock")    
      doItemEraseAttribute(ball, "unique")
      return true
   end
end
return false
end

function getGuildMembersOnline(GuildId)
local players = {}
for _, pid in pairs(getPlayersOnline()) do
    if getPlayerGuildId(pid) == tonumber(GuildId) then
       table.insert(players, pid)
    end
end                                                   --by Vodkart
return #players > 0 and players or false
end

function getGuildMembers(GuildId)
local players,query = {},db.getResult("SELECT `name` FROM `players` WHERE `rank_id` IN (SELECT `id` FROM `guild_ranks` WHERE `guild_id` = " .. GuildId .. ");")
if (query:getID() ~= -1) then  
   repeat
         table.insert(players,query:getDataString("name"))
   until not query:next()                           --by Vodkart
   query:free()
end
return #players > 0 and players or false
end 
--/////////////////////////////////////////////////////////////////////////////////---
function sendMsgToPlayer(cid, tpw, msg)      --alterado v1.7 \/\/\/
if not isCreature(cid) or not tpw or not msg then return true end
return doPlayerSendTextMessage(cid, tpw, msg)
end

function getPlayerDesc(cid, thing, TV)
if (not isCreature(cid) or not isCreature(thing)) and not TV then return "" end

local pos = getThingPos(thing)
local ocup = youAre[getPlayerGroupId(thing)]
local rank = (getPlayerStorageValue(thing, 86228) <= 0) and "a Pokemon Trainer" or lookClans[getPlayerStorageValue(thing, 86228)][getPlayerStorageValue(thing, 862281)]
local name = thing == cid and "yourself" or getCreatureName(thing)     
local art = thing == cid and "You are" or (getPlayerSex(thing) == 0 and "She is" or "He is")
   
local str = {}
table.insert(str, "You see "..name..". "..art.." ")
if youAre[getPlayerGroupId(thing)] then
   table.insert(str, (ocup).." and "..rank.." from ".. getTownName(getPlayerTown(thing))..".")       
else
   table.insert(str, (rank).." from ".. getTownName(getPlayerTown(thing))..".")
end
if getPlayerGuildId(thing) > 0 then
   table.insert(str, " "..art.." "..getPlayerGuildRank(thing).." from the "..getPlayerGuildName(thing)..".")
end
if TV then
   table.insert(str, " "..art.." watching TV.")
end
table.insert(str, ((isPlayer(cid) and youAre[getPlayerGroupId(cid)]) and "\nPosition: [X: "..pos.x.."][Y: "..pos.y.."][Z: "..pos.z.."]" or "")) 

return table.concat(str) 
end

function doRevivePokemon(cid, pokemon)
  if getPlayerItemCount(cid, 12344) <= 0 then return doPlayerSendCancel(cid, "Voce nao tem nenhum revive.") end
  local cooldownMoves = {
    ["Selfdestruct"] = 30,
    ["Selfdestruction"] = 30,
  }
  local balls = getPokeballsInContainerNew(getPlayerSlotItem(cid, 3).uid)
  if isPokeball(getPlayerSlotItem(cid, CONST_SLOT_FEET).itemid) then
    table.insert(balls, getPlayerSlotItem(cid, CONST_SLOT_FEET))
  end
  for i =1, #balls do
    local ball = balls[i]
	-- print("Pokemon: "..pokemon.." attrpoke> "..(getItemAttribute(ball.uid, "poke") or "sempoke").." attrnick> "..(getItemAttribute(ball.uid, "nick") or "sem nick"))
    if getItemAttribute(ball.uid, "poke") == pokemon or getItemAttribute(ball.uid, "nick") == pokemon then
	  -- print("IGUAL")
      for type, index in pairs(pokeballs) do
	    -- print(index.on.." / "..index.off)
	    if ball.itemid == index.on or ball.itemid == index.off then
		  -- print("revive")
		  doTransformItem(ball.uid, index.on)
          doSetItemAttribute(ball.uid, "hp", 1)
          local name = getItemAttribute(ball.uid, "poke")
          for c = 1, 15 do
            local str = "move"..c
            local move = movestable[name][str]; move = move and cooldownMoves[move.name]
            setCD(ball.uid, str, move or 0)
          end
          setCD(ball.uid, "control", 0)
          setCD(ball.uid, "blink", 0) --alterado v1.6
          doSendMagicEffect(getThingPos(cid), 13)
		  doPlayerRemoveItem(cid, 12344, 1)
          doCureBallStatus(ball.uid, "all")
		  doUpdatePokemonsBar(cid)
	      cleanBuffs2(ball.uid) --alterado v1.5
		  return
		end
	  end
	end
  end
end

function getPokeballsInContainerNew(container)
  if not isContainer(container) then return {} end
  local items = {}
  if isContainer(container) and getContainerSize(container) > 0 then
  	for slot=0, (getContainerSize(container)-1) do
      local item = getContainerItem(container, slot)
      if isContainer(item.uid) then
      	local itemsbag = getPokeballsInContainerNew(item.uid)
      	for i=0, #itemsbag do
          table.insert(items, itemsbag[i])
      	end
      elseif isPokeball(item.itemid) then
      	table.insert(items, item)
      end
  	end
  end
  return items
end

-------------------------------------------------------------------------------------------------   /\/\
function getLivePokeballs(cid, container, duel) 
    if not isCreature(cid) then return {} end     
	if not isContainer(container) then return {} end
	local items = {}
	---
	local ballSlot = getPlayerSlotItem(cid, 8)
    if ballSlot.uid ~= 0 then
       for a, b in pairs (pokeballs) do
           if ballSlot.itemid == b.on or ballSlot.itemid == b.use then
              if duel and getPlayerLevel(cid) >= (pokes[getItemAttribute(ballSlot.uid, "poke")].level + getPokeballBoost(ballSlot)) then
                 table.insert(items, ballSlot.uid)                                                                      --alterado v1.8
              elseif not duel then
                 table.insert(items, ballSlot.uid)
              end
           end
       end
    end
    ---     
	if isContainer(container) and getContainerSize(container) > 0 then      
		for slot=0, (getContainerSize(container)-1) do
			local item = getContainerItem(container, slot)
				if isContainer(item.uid) then
					local itemsbag = getPokeballsInContainer(item.uid)
					for i=0, #itemsbag do
						if not isInArray(items, itemsbag[i]) then
                           table.insert(items, itemsbag[i])
                        end
					end
				elseif isPokeball(item.itemid) then
				    for a, b in pairs (pokeballs) do
                        if item.itemid == b.on then
                           if duel and getPlayerLevel(cid) >= (pokes[getItemAttribute(item.uid, "poke")].level + getPokeballBoost(item)) then    
					          table.insert(items, item.uid)                                            --alterado v1.8
                           elseif not duel then
                              table.insert(items, item.uid)
                           end
	                    end
                    end
				end
		end
	end
return items
end

function addItemInFreeBag(container, item, num)
if not isContainer(container) or not item then return false end                                             
if not num or num <= 0 then num = 1 end                                            --alterado v1.6.1
if getContainerSize(container) < getContainerCap(container) then
   return doAddContainerItem(container, item, num)
else
   for slot = 0, (getContainerSize(container)-1) do
       local container2 = getContainerItem(container, slot)
       if isContainer(container2.uid) and getContainerSize(container2.uid) < getContainerCap(container2.uid) then
          return doAddContainerItem(container2.uid, item, num)
       end
   end
end
return false
end
------------------------------------------------------------------------------------------------------
function pokeHaveReflect(cid)
if not isCreature(cid) then return false end
local table = getTableMove(cid, "Reflect")
if table and table.name then     --alterado v1.6
   return true 
end
return false
end
------------------------------------------------------------------------------------------------------
function nextHorario(cid)
    horarioAtual = os.date("%X")
    horario = string.explode(horarioAtual, ":")
    
    for i = 1, #horas do
        horarioComparacao = horas[i]
        horarioComp = string.explode(horarioComparacao, ":")
        ---------------
        if tonumber(horarioComp[1]) > tonumber(horario[1]) then
           return horarioComparacao                                
        elseif tonumber(horarioComp[1]) == tonumber(horario[1]) and tonumber(horario[2]) < tonumber(horarioComp[2]) then
           return horarioComparacao
        end
    end 
    return horas[1]                                  
end                                                               

function getTimeDiff(timeDiff)
local dateFormat = {
{'hour', timeDiff / 60 / 60}, --6%
{'min', timeDiff / 60 % 60},
}
local out = {}                                   
for k, t in ipairs(dateFormat) do
    local v = math.floor(t[2])
    if(v > -1) then
         table.insert(out, (k < #dateFormat and '' or ' and ') .. v .. '' .. (v <= 1 and t[1] or t[1].."s"))
    end
end
if tonumber(dateFormat[1][2]) == 0 and tonumber(dateFormat[2][2]) == 0 then
   return "seconds"
end
return table.concat(out)
end

function getTimeDiff2(timeDiff)
local dateFormat = {
{'hour', timeDiff / 60 / 60}, --6%
{'min', timeDiff / 60 % 60},
{'sec', timeDiff % 60},
}
local out = {}                                  
for k, t in ipairs(dateFormat) do
    local v = math.floor(t[2])
    if(v > 0) then
         table.insert(out, (k < #dateFormat and ' ' or ' and ') .. v .. '' .. (v <= 1 and t[1] or t[1].."s"))
    end
end
return table.concat(out)
end 

function showTimeDiff(timeComp)
local b = string.explode(os.date("%X"), ":")
local c = string.explode(timeComp, ":")
    ---
    local d, m, y = os.date("%d"), os.date("%m"), os.date("%Y")
    local hAtual, mAtual = tonumber(b[1]), tonumber(b[2])
    local hComp, mComp = tonumber(c[1]), tonumber(c[2])
    ---
    local t = os.time{year= y, month= m, day= d, hour= hAtual, min= mAtual}
    local t1 = os.time{year= y, month= m, day= d, hour= hComp, min= mComp}
    ---                                                                       
    comparacao = t1-t
    if hComp < hAtual then
       v = os.time{year= y, month= m, day= d, hour= 24, min= 0}
       v2 = os.time{year= y, month= m, day= d, hour= 0, min= 0}
       comparacao = (v-t)+(t1-v2)
    end
return getTimeDiff(comparacao)
end
-------------------------------------------------------------------------
function cleanCMcds(item)
if item ~= 0 then
   for c = 1, 15 do              --alterado v1.5
      local str = "cm_move"..c
      setCD(item, str, 0)
   end
end
end

function ehNPC(cid)   --alterado v1.9
return isCreature(cid) and not isPlayer(cid) and not isSummon(cid) and not isMonster(cid)
end

function ehMonstro(cid)
local eh = false
    if not isSummon(cid) and not ehNPC(cid) and not isPlayer(cid) then
        eh = true
    end
    return eh
end                                                      --alterado v1.9.1 /\

function doAppear(cid) --Faz um poke q tava invisivel voltar a ser visivel...
if not isCreature(cid) then return true end
doRemoveCondition(cid, CONDITION_INVISIBLE)
doRemoveCondition(cid, CONDITION_OUTFIT)
doCreatureSetHideHealth(cid, false)
end

function doDisapear(cid)   --Faz um pokemon ficar invisivel
if not isCreature(cid) then return true end
doCreatureAddCondition(cid, permanentinvisible)
doCreatureSetHideHealth(cid, true)
doSetCreatureOutfit(cid, {lookType = 2}, -1)
end

function getThingFromPosWithProtect(pos)  --Pega uma creatura numa posiçao com proteçoes
if hasTile(pos) then
   if isCreature(getRecorderCreature(pos)) then
      return getRecorderCreature(pos)
   else
      pos.stackpos = 253
      pid = getThingfromPos(pos).uid
   end
else
   pid = getThingfromPos({x=1,y=1,z=10,stackpos=253}).uid
end
return pid
end

function getTileThingWithProtect(pos)    --Pega um TILE com proteçoes
if hasTile(pos) then
pos.stackpos = 0
   pid = getTileThingByPos(pos)
else
   pid = getTileThingByPos({x=1,y=1,z=10,stackpos=0})
end
return pid
end

function canAttackOther(cid, pid)         --Function q verifica se um poke/player pode atacar outro poke/player

if not isCreature(cid) or not isCreature(pid) then return "Cant" end

local master1 = isSummon(cid) and getCreatureMaster(cid) or cid
local master2 = isSummon(pid) and getCreatureMaster(pid) or pid
   
   ----             
   if getPlayerStorageValue(master1, 6598754) >= 5 and getPlayerStorageValue(master2, 6598754) >= 5 then
      if getPlayerStorageValue(master1, 6598754) ~= getPlayerStorageValue(master2, 6598754) then
         if isDuelingAgainst(master1, master2) then   --alterado v1.8
            if isSummon(cid) and isPlayer(pid) then
               return "Cant"
            else
               return "Can"
            end
         end
      end
   end
   ----              pvp system
   if getPlayerStorageValue(master1, 6598754) >= 1 and getPlayerStorageValue(master2, 6598755) >= 1 then
      return "Can" 
   end
   if getPlayerStorageValue(master1, 6598755) >= 1 and getPlayerStorageValue(master2, 6598754) >= 1 then  ---estar em times diferentes
      return "Can"
   end
   ----
if getTileInfo(getThingPos(cid)).pvp then

return "Can"

end

   if ehMonstro(cid) or ehMonstro(pid) then
      return "Can"
   end

return "Cant"
end
   
      
function stopNow(cid, time)   
if not isCreature(cid) or not tonumber(time) or isSleeping(cid) then return true end
                                                        --alterado v1.9.1 \/
local function podeMover(cid)                         
if isPlayer(cid) then 
   mayNotMove(cid, false) 
elseif isCreature(cid) then 
   doRegainSpeed(cid) 
end
end

if isPlayer(cid) then mayNotMove(cid, true) else doChangeSpeed(cid, -getCreatureSpeed(cid)) end
addEvent(podeMover, time, cid)
end

function doReduceStatus(cid, off, def, agi)   --reduz os status
if not isCreature(cid) then return true end
local A = getOffense(cid)
local B = getDefense(cid)
local C = getSpeed(cid)

if off > 0 then
   setPlayerStorageValue(cid, 1001, A - off)
end
if def > 0 then
   setPlayerStorageValue(cid, 1002, B - def)
end
if agi > 0 then
   setPlayerStorageValue(cid, 1003, C - agi)
   if getCreatureSpeed(cid) ~= 0 then
      doRegainSpeed(cid)
   end                                              --alterado v1.5  functions arrumadas...
end
end

function doRaiseStatus(cid, off, def, agi, time)  
if not isCreature(cid) then return true end
local A = getOffense(cid)
local B = getDefense(cid)
local C = getSpeed(cid)

if off > 0 then
   setPlayerStorageValue(cid, 1001, A * off)
end
if def > 0 then
   setPlayerStorageValue(cid, 1002, B * def)
end
if agi > 0 then
   setPlayerStorageValue(cid, 1003, C + agi)
   if getCreatureSpeed(cid) ~= 0 then
      doRegainSpeed(cid)
   end
end

local D = getOffense(cid)
local E = getDefense(cid)
local F = getSpeed(cid)
---------------------------
local G = D - A
local H = E - B
local I = F - C

addEvent(doReduceStatus, time*500, cid, G, H, I)
end


function BackTeam(cid)          
  if isCreature(cid) then
     local summon = getCreatureSummons(cid)   --alterado v1.6
     for i = 2, #summon do
         doSendMagicEffect(getThingPos(summon[i]), 211)
         doRemoveCreature(summon[i])
     end
     setPlayerStorageValue(cid, 637501, -1)
  end  
end
    
function choose(...) -- by mock
    local arg = {...}
    return arg[math.random(1,#arg)]
end

function AddPremium(cid, days)
local function removerPlayer(cid)
if isCreature(cid) then
   doRemoveCreature(cid)
end
end

db.executeQuery("UPDATE `accounts` SET `premdays` = '"..days.."' WHERE `accounts`.`id` = ".. getPlayerAccountId(cid) ..";")
doPlayerSendTextMessage(cid,25,"Você será kickado em 5 segundos.")    
addEvent(removerPlayer, 5*1000, cid)     
return TRUE
end

function isShiny(cid) 
return isCreature(cid) and string.find(getCreatureName(cid), "Shiny")  --alterado v1.9
end

function isShinyName(name)        
return tostring(name) and string.find(doCorrectString(name), "Shiny") --alterado v1.9
end

function doConvertTypeToStone(type, string)
local t = {
["fly"] = {heart, "heart"},
["flying"] = {heart, "heart"},
["normal"] = {heart, "heart"},
["fire"] = {fire, "fire"},
["grass"] = {leaf, "leaf"},
["leaf"] = {leaf, "leaf"},
["water"] = {water, "water"},
["poison"] = {venom, "venom"},
["venom"] = {venom, "venom"},
["electric"] = {thunder, "thunder"},
["thunder"] = {thunder, "thunder"},
["rock"] = {rock, "rock"},
["fight"] = {punch, "punch"},
["fighting"] = {punch, "punch"},
["bug"] = {coccon, "coccon"},
["dragon"] = {crystal, "crystal"},
["dark"] = {dark, "dark"},
["ghost"] = {dark, "dark"},
["ground"] = {earth, "earth"},
["earth"] = {earth, "earth"},
["psychic"] = {enigma, "enigma"},
["steel"] = {metal, "metal"},
["ancient"] = {ancient, "ancient"},
["metal"] = {metal, "metal"},
["ice"] = {ice, "ice"},
["boost"] = {boostStone, "boost"},  --alterado v1.9
}

if string then
return t[type][2]
else
return t[type][1]
end
end

function doConvertStoneIdToString(stoneID)
local t = {
[11453] = "Heart Stone",
[11441] = "Leaf Stone",
[11442] = "Water Stone",
[11443] = "Venom Stone",
[11444] = "Thunder Stone",
[11445] = "Rock Stone",
[11446] = "Punch Stone", 
[11447] = "Fire Stone",               --alterado v1.6
[11448] = "Cocoon Stone", 
[11449] = "Crystal Stone",
[11450] = "Darkess Stone", 
[11451] = "Earth Stone",
[11452] = "Enigma Stone",
[11454] = "Ice Stone", 
[12244] = "Ancient Stone",
[12232] = "Metal Stone",
[12401] = "Shiny Fire Stone",
[12402] = "Shiny Water Stone",
[12403] = "Shiny Leaf Stone",
[12404] = "Shiny Heart Stone",
[12405] = "Shiny Enigma Stone",
[12406] = "Shiny Rock Stone",
[12407] = "Shiny Venom Stone", 
[12408] = "Shiny Ice Stone",
[12409] = "Shiny Thunder Stone",
[12410] = "Shiny Crystal Stone",
[12411] = "Shiny Cocoon Stone",
[12412] = "Shiny Darkness Stone",
[12413] = "Shiny Punch Stone",
[12414] = "Shiny Earth Stone",
[boostStone] = "Boost Stone",  --alterado v1.9
[20897] = "Virus",
[20898] = "Glice Stone",
[20899] = "Green Stone",
[20900] = "Mag Stone",
[20901] = "Electri Stone",
[20902] = "Perior Stone",
[20903] = "Kiss Stone",
[20904] = "Shiny Stone",
[20905] = "Zone Stone",
[21996] = "Llade Stone",
[21997] = "Scor Stone",
[21998] = "Licky Stone",
[21999] = "Poryz Stone",
[22000] = "Probo Stone",
[22001] = "Wea Stone",
[22002] = "Yanm Stone",
[22003] = "Fros Stone",
[22004] = "Special Stone",
[22067] = "Super Darkness Stone",
[22068] = "Super Ice Stone",
[22071] = "Super Fire Stone",
[22072] = "Super Water Stone",
}
if t[stoneID] then
return t[stoneID]
else
return ""
end
end

function isStone(id)
if id >= leaf and id <= ice then
return true
end
if id == boostStone then  --alterado v1.9
return true
end
if id == 12232 or id == 12244 or id == 12244 or id == 12245 then
return true                                 
end
if id == 20904 then
return true                                 
end
if (id >= sfire and id <= searth) or id == 12417 or id == 12419 then
return true 
end
return false
end

function isWater(id)
return tonumber(id) and id >= 4820 and id <= 4825 --alterado v1.9
end

function getTopCorpse(position)
local pos = position
for n = 1, 255 do
    pos.stackpos = n
    local item = getTileThingByPos(pos)
    if item.itemid >= 2 and (string.find(getItemNameById(item.itemid), "fainted ") or string.find(getItemNameById(item.itemid), "defeated ")) then
       return getTileThingByPos(pos)
    end
end
return null
end

bpslot = CONST_SLOT_BACKPACK

function hasPokemon(cid)
	if not isCreature(cid) then return false end
	if getCreatureMana(cid) <= 0 then return false end
	if #getCreatureSummons(cid) >= 1 then return true end
	local item = getPlayerSlotItem(cid, CONST_SLOT_FEET)
	local bp = getPlayerSlotItem(cid, bpslot)
	for a, b in pairs (pokeballs) do
        if item.itemid == b.on or item.itemid == b.use then
        return true                              --alterado v1.4
        end
        if #getItemsInContainerById(bp.uid, b.on) >= 1 then
        return true
        end
	end
return false
end

function isNpcSummon(cid)
return isNpc(getCreatureMaster(cid))
end

--function getPokemonHappinessDescription(cid)
--	if not isCreature(cid) then return true end
--	local str = {}
	--if getPokemonGender(cid) == SEX_MALE then
	--	table.insert(str, "He")
	--elseif getPokemonGender(cid) == SEX_FEMALE then
	--	table.insert(str, "She")
	--else
	--	table.insert(str, "It")
	--end
	--local h = getPlayerStorageValue(cid, 1008)
--	if h >= tonumber(getConfigValue('PokemonStageVeryHappy')) then
--		table.insert(str, " is very happy with you!")
--	elseif h >= tonumber(getConfigValue('PokemonStageHappy')) then
--		table.insert(str, " is happy.")
--	elseif h >= tonumber(getConfigValue('PokemonStageOK')) then
--		table.insert(str, " is unhappy.")
--	elseif h >= tonumber(getConfigValue('PokemonStageSad')) then
--		table.insert(str, " is sad.")
--	elseif h >= tonumber(getConfigValue('PokemonStageMad')) then
--		table.insert(str, " is mad.")
--	else
--		table.insert(str, " is very mad at you!")
--	end
--return table.concat(str)
--end

function doSetItemAttribute(item, key, value)
doItemSetAttribute(item, key, value)
end

function deTransform(cid, check)
	if not isCreature(cid) then return true end

	local m = getCreatureMaster(cid)
	local p = getPlayerSlotItem(m, 8)

	if getItemAttribute(p.uid, "transTurn") ~= check then return true end

	setPlayerStorageValue(cid, 1010, getCreatureName(cid) == "Ditto" and "Ditto" or "Shiny Ditto")        --edited
	doRemoveCondition(cid, CONDITION_OUTFIT)
	doSendMagicEffect(getThingPos(cid), 184)
	doCreatureSay(cid, "DITTO!", TALKTYPE_MONSTER)
	doItemSetAttribute(p.uid, "transBegin", 0)
	doItemSetAttribute(p.uid, "transLeft", 0)
	doItemEraseAttribute(p.uid, "transName")
	adjustStatus(cid, p.uid, true, true, true)
end

function isTransformed(cid)
return isCreature(cid) and not isInArray({-1, "Ditto", "Shiny Ditto"}, getPlayerStorageValue(cid, 1010))  --alterado v1.9
end

function doSendFlareEffect(pos)
	local random = {28, 29, 79}
	doSendMagicEffect(pos, random[math.random(1, 3)])
end

function isDay()
	local a = getWorldTime()
	if a >= 360 and a < 1080 then
	return true
	end
return false
end

function doPlayerSendTextWindow(cid, p1, p2)
	if not isCreature(cid) then return true end
	local item = 460
	local text = ""
	if type(p1) == "string" then
		doShowTextDialog(cid, item, p1)
	else
		doShowTextDialog(cid, p1, p2)
	end
end

function getClockString(tw)
	local a = getWorldTime()
	local b = a / 60
	local hours = math.floor(b)
	local minut = a - (60 * hours)

	if not tw then
		if hours < 10 then
			hours = "0"..hours..""
		end
		if minut < 10 then
			minut = "0"..minut..""
		end
	return hours..":"..minut
	else
		local sm = "a.m"
		if hours >= 12 then
			hours = hours - 12
			sm = "p.m"
		end
		if hours < 10 then
			hours = "0"..hours..""
		end
		if minut < 10 then
			minut = "0"..minut..""
		end
	return hours..":"..minut.." "..sm
	end
end

function doCorrectPokemonName(poke)
return doCorrectString(poke)
end

function doCorrectString(str)
local name = str:explode(" ")  --alterado v1.9
local final = {}
for _, s in ipairs(name) do
    table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower())
end
return table.concat(final, (name[2] and " " or ""))
end   

function getHappinessRate(cid)
	if not isCreature(cid) then return 1 end
	local a = getPlayerStorageValue(cid, 1008)
		if a == -1 then return 1 end
	if a >= getConfigValue('PokemonStageVeryHappy') then
		return happinessRate[5].rate
	elseif a >= getConfigValue('PokemonStageHappy') then
		return happinessRate[4].rate
	elseif a >= getConfigValue('PokemonStageOK') then
		return happinessRate[3].rate
	elseif a >= getConfigValue('PokemonStageSad') then
		return happinessRate[2].rate
	else
		return happinessRate[1].rate
	end
return 1
end

function doBodyPush(cid, target, go, pos)
	if not isCreature(cid) or not isCreature(target) then
		doRegainSpeed(cid)
		doRegainSpeed(target)
	return true
	end
		if go then
			local a = getThingPos(cid)
			doChangeSpeed(cid, -getCreatureSpeed(cid))
				if not isPlayer(target) then
					doChangeSpeed(target, -getCreatureSpeed(target))
				end
			doChangeSpeed(cid, 800)
			doTeleportThing(cid, getThingPos(target))
			doChangeSpeed(cid, -800)
			addEvent(doBodyPush, 350, cid, target, false, a)
		else
			doChangeSpeed(cid, 800)
			doTeleportThing(cid, pos)
			doRegainSpeed(cid)
			doRegainSpeed(target)
		end
end

function doReturnPokemon(cid, pokemon, pokeball, effect, hideeffects, blockevo)

    --////////////////////////////////////////////////////////////////////////////////////////--
	checkDuel(cid)                                                                      --alterado v1.6 duel system
    --////////////////////////////////////////////////////////////////////////////////////////--
    if getPlayerStorageValue(cid, 52480) >= 1 and getPlayerStorageValue(cid, 52484) ~= 10 then
       return sendMsgToPlayer(cid, 27, "You can't do that while the duel don't begins!")        --alterado v1.8
    end
    --////////////////////////////////////////////////////////////////////////////////////////--
    
    if #getCreatureSummons(cid) > 1 and getPlayerStorageValue(cid, 212124) <= 0 then     --alterado v1.6
       if getPlayerStorageValue(cid, 637501) == -2 or getPlayerStorageValue(cid, 637501) >= 1 then  
          BackTeam(cid)       
       end
    end
    -----------------
	local edit = true

	if not pokeball then
		pokeball = getPlayerSlotItem(cid, 8)
	end

	if blockevo then
		edit = false
		doPlayerSendCancel(cid, "Your pokemon couldn't evolve due to server mistakes, please wait until we fix the problem.")
	end

	local happy = getPlayerStorageValue(pokemon, 1008)
	local hunger = getPlayerStorageValue(pokemon, 1009)
	local pokelife = (getCreatureHealth(pokemon) / getCreatureMaxHealth(pokemon))

	if edit then
		doItemSetAttribute(pokeball.uid, "happy", happy)
		doItemSetAttribute(pokeball.uid, "hunger", hunger)
		doItemSetAttribute(pokeball.uid, "hp", pokelife)
	end

--	if getCreatureName(pokemon) == "Ditto" then
--		if isTransformed(pokemon) then
	--		local left = getItemAttribute(pokeball.uid, "transLeft") - (os.clock() - getItemAttribute(pokeball.uid, "transBegin"))
	--		doItemSetAttribute(pokeball.uid, "transLeft", left)
	--	end
--	end

	if hideeffects then
		doRemoveCreature(pokemon)
	return true
	end

	local pokename = getPokeName(pokemon)

	local mbk = gobackmsgs[math.random(1, #gobackmsgs)].back:gsub("doka", pokename)

	if getCreatureCondition(cid, CONDITION_INFIGHT) then
		if isCreature(getCreatureTarget(cid)) then
			doItemSetAttribute(pokeball.uid, "happy", happy - 5)
		else
			doItemSetAttribute(pokeball.uid, "happy", happy - 2)
		end
	end

	doTransformItem(pokeball.uid, pokeball.itemid-1)
	doCreatureSay(cid, mbk, 19)

	doSendMagicEffect(getCreaturePosition(pokemon), effect)

	doRemoveCreature(pokemon)

    unLock(pokeball.uid) --alterado v1.8
    
    if useOTClient then
       doPlayerSendCancel(cid, '12//,hide')  --alterado v1.7
    end
    
	if useKpdoDlls then
		doUpdateMoves(cid)
	end

end

local EFFECTS = {
	--[OutfitID] = {Effect}
	["Magmar"] = 35,                --alterado v1.5
	["Shiny Magmar"] = 35,
	["Magby"] = 35,
	["Jynx"] = 17,   
	["Smoochum"] = 17, 
	["Shiny Jynx"] = 17,    
	["Piloswine"] = 205,  --alterado v1.8
    ["Swinub"] = 205, 
    ["Stantler"] = 205, 
    ["Shiny Stantler"] = 205, 
}

function doGoPokemon(cid, item)

	if getPlayerStorageValue(cid, 17000) >= 1 or getPlayerStorageValue(cid, 17001) >= 1 or getPlayerStorageValue(cid, 63215) >= 1 then
	return true
	end
---------------------------------------------------------------
local ballName = getItemAttribute(item.uid, "poke")

   btype = getPokeballType(item.itemid)                   

	local effect = pokeballs[btype].effect
		if not effect then
			effect = 21
		end
-----------------------------------------------------------------
	if item.uid ~= getPlayerSlotItem(cid, CONST_SLOT_FEET).uid then
		doPlayerSendCancel(cid, "You must put your pokeball in the correct place!")
	return TRUE
	end

	local thishp = getItemAttribute(item.uid, "hp")

	if thishp <= 0 then
		if isInArray(pokeballs[btype].all, item.itemid) then
			doTransformItem(item.uid, pokeballs[btype].off)
			doItemSetAttribute(item.uid, "hp", 0)
			doPlayerSendCancel(cid, "This pokemon is fainted.")
		    return true
		end
	end

	local pokemon = getItemAttribute(item.uid, "poke")

	if not pokes[pokemon] then
	return true
	end

----------------------- Sistema de nao poder carregar mais que 3 pokes lvl baixo e + q 1 poke de lvl medio/alto ---------------------------------
if not isInArray({5, 6}, getPlayerGroupId(cid)) then
   local balls = getPokeballsInContainer(getPlayerSlotItem(cid, 3).uid)      --alterado v1.9 \/
   local low = {}
   local lowPokes = {"Rattata", "Caterpie", "Weedle", "Oddish", "Pidgey", "Paras", "Poliwag", "Bellsprout", "Magikarp", "Hoppip", "Sunkern"}
   if #balls >= 1 then
      for _, uid in ipairs(balls) do
          local nome = getItemAttribute(uid, "poke")
          if not isInArray(lowPokes, pokemon) and nome == pokemon then
             return doPlayerSendTextMessage(cid, 27, "Sorry, but you can't carry two pokemons equals!")
          else
             if nome == pokemon then
                table.insert(low, nome)
             end
          end
      end
   end
if #low >= 3 then
   return doPlayerSendTextMessage(cid, 27, "Sorry, but you can't carry more than three pokemons equals of low level!")
end   
end
---------------------------------------------------------------------------------------------------------------------------------------------------

	local x = pokes[pokemon]
	local boosts = getItemAttribute(item.uid, "boost") or 0

	if getPlayerLevel(cid) < (x.level + boosts) then   --alterado v1.8 \/
	doPlayerSendCancel(cid, "You need level "..(x.level + boosts).." to use this pokemon.")
	return true
	end
	
	--------------------------------------------------------------------------------------
	shinysClan = {
	["Shiny Fearow"] = {4, "Wingeon"},
	["Shiny Flareon"] = {1, "Volcanic"},
	["Shiny Vaporeon"] = {2, "Seavel"}, 
	["Shiny Jolteon"] = {9, "Raibolt"},
	["Shiny Hypno"] = {7, "Psycraft"},
	["Shiny Golem"] = {3, "Orebound"},         
	["Shiny Vileplume"] = {8, "Naturia"},
	["Shiny Nidoking"] = {5, "Malefic"},
	["Shiny Hitmontop"] = {6, "Gardestrike"},   
	["Shiny Metagross"] = {9, "Ironhead"},
	}
	
	if shinysClan[pokemon] and (getPlayerGroupId(cid) < 4 or getPlayerGroupId(cid) > 6) then --alterado v1.9
	   if getPlayerStorageValue(cid, 86228) ~= shinysClan[pokemon][1] then
	      doPlayerSendCancel(cid, "You need be a member of the clan "..shinysClan[pokemon][2].." to use this pokemon!")
	      return true   
       elseif getPlayerStorageValue(cid, 862281) ~= 5 then
          doPlayerSendCancel(cid, "You need be atleast rank 5 to use this pokemon!")
	      return true
       end
    end
    --------------------------------------------------------------------------------------

	doSummonMonster(cid, pokemon)

	local pk = getCreatureSummons(cid)[1]
	if not isCreature(pk) then return true end
	
	------------------------passiva hitmonchan------------------------------
	if isSummon(pk) then                                                  --alterado v1.8 \/
       if pokemon == "Shiny Hitmonchan" or pokemon == "Hitmonchan" then
          if not getItemAttribute(item.uid, "hands") then
             doSetItemAttribute(item.uid, "hands", 0)
          end
          local hands = getItemAttribute(item.uid, "hands")
          doSetCreatureOutfit(pk, {lookType = hitmonchans[pokemon][hands].out}, -1)
       end
    end
	-------------------------------------------------------------------------
    ---------movement magmar, jynx-------------
    if EFFECTS[getCreatureName(pk)] then     
       markPosEff(pk, getThingPos(pk))
       sendMovementEffect(pk, EFFECTS[getCreatureName(pk)], getThingPos(pk))   
    end
    --------------------------------------------------------------------------  

	if getCreatureName(pk) == "Ditto" then

		local left = getItemAttribute(item.uid, "transLeft")
		local name = getItemAttribute(item.uid, "transName")

		if left and left > 0 then
			setPlayerStorageValue(pk, 1010, name)
			doSetCreatureOutfit(pk, {lookType = getItemAttribute(item.uid, "transOutfit")}, -1)
			addEvent(deTransform, left * 1000, pk, getItemAttribute(item.uid, "transTurn"))
			doItemSetAttribute(item.uid, "transBegin", os.clock())
		else
			setPlayerStorageValue(pk, 1010, "Ditto")
		end
	end

	if isGhostPokemon(pk) then doTeleportThing(pk, getPosByDir(getThingPos(cid), math.random(0, 7)), false) end

	doCreatureSetLookDir(pk, 2)

	adjustStatus(pk, item.uid, true, true, true)
	doAddPokemonInOwnList(cid, pokemon)

	doTransformItem(item.uid, item.itemid+1)

	local pokename = getPokeName(pk) --alterado v1.7

	local mgo = gobackmsgs[math.random(1, #gobackmsgs)].go:gsub("doka", pokename)
	doCreatureSay(cid, mgo, TALKTYPE_SAY)

	doSendMagicEffect(getCreaturePosition(pk), effect)

    unLock(item.uid) --alterado v1.8

	
local pk = getCreatureSummons(cid)[1]
local pb = getPlayerSlotItem(cid, 8).uid
local look = getItemAttribute(pb,"addon")
if not look then
doSetItemAttribute(pb,"addon",0)

end
if look > 0 then
doSetCreatureOutfit(pk, {lookType = look}, -1)

end	
	if useKpdoDlls then
		doUpdateMoves(cid)
	end
end

function doRegainSpeed(cid)              --alterado v1.9 \/
if not isCreature(cid) then return true end

   local speed = PlayerSpeed
   if isMonster(cid) then
      speed = getSpeed(cid)
   elseif isPlayer(cid) and isInArray({4, 5, 6}, getPlayerGroupId(cid)) then
      speed = 200*getPlayerGroupId(cid) 
   end
   
   doChangeSpeed(cid, -getCreatureSpeed(cid))
   if getCreatureCondition(cid, CONDITION_PARALYZE) == true then
      doRemoveCondition(cid, CONDITION_PARALYZE)
      addEvent(doAddCondition, 10, cid, paralizeArea2)             
   end
    
doChangeSpeed(cid, speed)
return speed
end

function isPosEqualPos(pos1, pos2, checkstackpos)
	if pos1.x ~= pos2.x or pos1.y ~= pos2.y and pos1.z ~= pos2.z then
	return false
	end
	if checkstackpos and pos1.stackpos and pos2.stackpos and pos1.stackpos ~= pos2.stackpos then
	return false
	end
return true
end

function getRandomGenderByName(name)
local rate = newpokedex[name]
	if not rate then return 0 end
	rate = rate.gender
	if rate == 0 then
		gender = 3
	elseif rate == 1000 then
		gender = 4
	elseif rate == -1 then
		gender = 0
	elseif math.random(1, 1000) <= rate then
		gender = 4
	else
		gender = 3
	end
return gender
end

function getRecorderCreature(pos, cid)
	local ret = 0
	if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
	   return cid
	end
	local s = {}
	s.x = pos.x
	s.y = pos.y
	s.z = pos.z
		for a = 0, 255 do
			s.stackpos = a
			local b = getTileThingByPos(s).uid
			if b > 1 and isCreature(b) and getCreatureOutfit(b).lookType ~= 814 then
				ret = b
			end
		end
return ret
end

function doCreatureSetOutfit(cid, outfit, time)
	doSetCreatureOutfit(cid, outfit, time)
end

function doMagicalFlower(cid, away)
	if not isCreature(cid) then return true end
	for x = -3, 3 do
		for y = -3, 3 do
		local a = getThingPos(cid)
		a.x = a.x + x
		a.y = a.y + y
			if away then
				doSendDistanceShoot(a, getThingPos(cid), 21)
			else
				doSendDistanceShoot(getThingPos(cid), a, 21)
			end
		end
	end
end		

function isItemPokeball(item)         --alterado v1.9 \/
if not item then return false end
for a, b in pairs (pokeballs) do
	if isInArray(b.all, item) then return true end
	if item >= 12861 and item <= 13781 then
	return true
	end
	if item >= 13797 and item <= 13823 then
	return true
	end
        if item >= 10975 and item <= 10977 then
        return true
	end
	if item >= 13836 and item <= 13850 then
	return true
	end
	if item >= 13851 and item <= 13856 then
	return true
	end
	if item >= 13859 and item <= 13861 then
	return true
	end
	if item >= 13902 and item <= 13904 then
	return true
	end
	if item >= 13919 and item <= 13930 then
	return true
	end
end
return false
end

function isPokeball(item)
if not item then return false end
for a, b in pairs (pokeballs) do
	if isInArray(b.all, item) then return true end
	if item >= 12861 and item <= 13781 then
	return true
	end
	if item >= 13797 and item <= 13823 then
	return true
	end
        if item >= 10975 and item <= 10977 then
        return true
	end
	if item >= 13836 and item <= 13856 then
	return true
	end
end
return false
end
function getPokeballType(id)
	for a, b in pairs (pokeballs) do
		if isInArray(b.all, id) then
			return a
		end
	end
return "none"
end

randomdiagonaldir = {
[NORTHEAST] = {NORTH, EAST},
[SOUTHEAST] = {SOUTH, EAST},
[NORTHWEST] = {NORTH, WEST},
[SOUTHWEST] = {SOUTH, WEST}}

function doFaceOpposite(cid)
local a = getCreatureLookDir(cid)
local d = {
[NORTH] = SOUTH,
[SOUTH] = NORTH,
[EAST] = WEST,
[WEST] = EAST,
[NORTHEAST] = SOUTHWEST,
[NORTHWEST] = SOUTHEAST,
[SOUTHEAST] = NORTHWEST,
[SOUTHWEST] = NORTHEAST}
doCreatureSetLookDir(cid, d[a])
end

function doFaceRandom(cid)
local a = getCreatureLookDir(cid)
local d = {
[NORTH] = {SOUTH, WEST, EAST},
[SOUTH] = {NORTH, WEST, EAST},
[WEST] = {SOUTH, NORTH, EAST},
[EAST] = {SOUTH, WEST, NORTH}}
doChangeSpeed(cid, 1)
doCreatureSetLookDir(cid, d[a][math.random(1, 3)])
doChangeSpeed(cid, -1)
end

function getFaceOpposite(dir)
local d = {
[NORTH] = SOUTH,
[SOUTH] = NORTH,
[EAST] = WEST,
[WEST] = EAST,
[NORTHEAST] = SOUTHWEST,
[NORTHWEST] = SOUTHEAST,
[SOUTHEAST] = NORTHWEST,
[SOUTHWEST] = NORTHEAST}
return d[dir]
end

function getResistance(cid, combat)
	if isPlayer(cid) then return false end
local poketype1 = pokes[getCreatureName(cid)].type
local poketype2 = pokes[getCreatureName(cid)].type2
local multiplier = 1
	if effectiveness[combat].super and isInArray(effectiveness[combat].super, poketype1) then
		multiplier = multiplier * 2
	end
	if poketype2 and effectiveness[combat].super and isInArray(effectiveness[combat].super, poketype2) then
		multiplier = multiplier * 2
	end
	if effectiveness[combat].weak and isInArray(effectiveness[combat].weak, poketype1) then
		multiplier = multiplier * 0.5
	end
	if poketype2 and effectiveness[combat].weak and isInArray(effectiveness[combat].weak, poketype2) then
		multiplier = multiplier * 0.5
	end
	if effectiveness[combat].non and isInArray(effectiveness[combat].non, poketype1) then
		multiplier = multiplier * 0
	end
	if poketype2 and effectiveness[combat].non and isInArray(effectiveness[combat].non, poketype2) then
		multiplier = multiplier * 0
	end

	if multiplier == 0.25 then
		multiplier = 0.5
	elseif multiplier == 4 then
		multiplier = 2
	end

return multiplier
end

function getCreatureDirectionToTarget(cid, target, ranged)
	if not isCreature(cid) then return true end
	if not isCreature(target) then return getCreatureLookDir(cid) end
	local dirs = {
	[NORTHEAST] = {NORTH, EAST},
	[SOUTHEAST] = {SOUTH, EAST},
	[NORTHWEST] = {NORTH, WEST},
	[SOUTHWEST] = {SOUTH, WEST}}
	local x = getDirectionTo(getThingPos(cid), getThingPos(target), false)
		if x <= 3 then return x
		else
			local xdistance = math.abs(getThingPos(cid).x - getThingPos(target).x)
			local ydistance = math.abs(getThingPos(cid).y - getThingPos(target).y)
				if xdistance > ydistance then
					return dirs[x][2]
				elseif ydistance > xdistance then
					return dirs[x][1]
				elseif isInArray(dirs[x], getCreatureLookDir(cid)) then
					return getCreatureLookDir(cid)
				else
					return dirs[x][math.random(1, 2)]
				end
		end
end

function getSomeoneDescription(cid)
	if isPlayer(cid) then return getPlayerNameDescription(cid) end
return getMonsterInfo(getCreatureName(cid)).description
end
	

function isGhostPokemon(cid)
	if not isCreature(cid) then return false end
	local ghosts = {"Gastly", "Haunter", "Gengar", "Shiny Gengar", "Misdreavus", "Shiny Abra"}
return isInArray(ghosts, getCreatureName(cid))
end

function updateGhostWalk(cid)
	if not isCreature(cid) then return false end
	local pos = getThingPos(cid)
	pos.x = pos.x + 1
	pos.y = pos.y + 1
	local ret = getThingPos(cid)
	doTeleportThing(cid, pos, false)
	doTeleportThing(cid, ret, false)
return true
end

function doRemoveElementFromTable(t, e)
	local ret = {}
	for a = 1, #t do
		if t[a] ~= e then
		table.insert(ret, t[a])
		end
	end
return ret
end

function doFaceCreature(sid, pos)
if not isCreature(sid) then return true end
	if getThingPos(sid).x == pos.x and getThingPos(sid).y == pos.y then return true end
	local ret = 0

	local ld = getCreatureLookDir(sid)
	local dir = getDirectionTo(getThingPos(sid), pos)
	local al = {
	[NORTHEAST] = {NORTH, EAST},
	[NORTHWEST] = {NORTH, WEST},
	[SOUTHEAST] = {SOUTH, EAST},
	[SOUTHWEST] = {SOUTH, WEST}}

	if dir >= 4 and isInArray(al[dir], ld) then return true end

	doChangeSpeed(sid, 1)
		if dir == 4 then
			ret = math.random(2, 3)
		elseif dir == 5 then
			ret = math.random(1, 2)
		elseif dir == 6 then
			local dirs = {0, 3}
			ret = dirs[math.random(1, 2)]
		elseif dir == 7 then
			ret = math.random(0, 1)
		else
			ret = getDirectionTo(getThingPos(sid), pos)
		end
doCreatureSetLookDir(sid, ret)
doChangeSpeed(sid, -1)
return true
end

function doCreatureAddCondition(cid, condition)
if not isCreature(cid) then return true end
doAddCondition(cid, condition)
end

function doCreatureRemoveCondition(cid, condition)
if not isCreature(cid) then return true end
doRemoveCondition(cid, condition)
end

function setCD(item, tipo, tempo)

	if not tempo or not tonumber(tempo) then
		doItemEraseAttribute(item, tipo)
	return true
	end

	doItemSetAttribute(item, tipo, "cd:"..(tempo + os.time()).."")
return tempo + os.time()
end

function getCD(item, tipo, limite)

	if not getItemAttribute(item, tipo) then
	return 0
	end

	local string = getItemAttribute(item, tipo):gsub("cd:", "")
	local number = tonumber(string) - os.time()

	if number <= 0 then
	return 0
	end

	if limite and limite < number then
		return 0
	end

return number
end

function doSendMoveEffect(cid, target, effect)
if not isCreature(cid) or not isCreature(target) then return true end
doSendDistanceShoot(getThingPos(cid), getThingPos(target), effect)
return true
end

function doSetItemActionId(uid, actionid)
doItemSetAttribute(uid, "aid", actionid)
return true
end

function threeNumbers(number)
	if number <= 9 then
	return "00"..number..""
	elseif number <= 99 then
	return "0"..number..""
	end
return ""..number..""
end

function isBr(cid)
if getPlayerStorageValue(cid, 105505) ~= -1 then
return true
end
return false
end

function isBeingUsed(ball)            
if not ball then return false end
for a, b in pairs (pokeballs) do           --alterado v1.9
    if b.use == ball then return true end
end
return false
end

function doRemoveTile(pos)-- Script by mock
pos.stackpos = 0
local sqm = getTileThingByPos(pos)
doRemoveItem(sqm.uid,1)
end

function doCreateTile(id,pos) -- By mock
doAreaCombatHealth(0,0,pos,0,0,0,CONST_ME_NONE)
doCreateItem(id,1,pos)
end

function hasSqm(pos)
local f = getTileThingByPos(pos)
if f.itemid ~= 0 and f.itemid ~= 1 then
return true
end
return false
end

function getPosDirs(p, dir) -- By MatheusMkalo
return dir == 1 and {x=p.x-1, y=p.y, z=p.z} or dir == 2 and {x=p.x-1, y=p.y+1, z=p.z} or dir == 3 and {x=p.x, y=p.y+1, z=p.z} or dir == 4 and {x=p.x+1, y=p.y+1, z=p.z} or dir == 5 and {x=p.x+1, y=p.y, z=p.z} or dir == 6 and {x=p.x+1, y=p.y-1, z=p.z} or dir == 7 and {x=p.x, y=p.y-1, z=p.z} or dir == 8 and {x=p.x-1, y=p.y-1, z=p.z}
end

function canWalkOnPos(pos, creature, pz, water, sqm, proj)
if not pos then return false end
if not pos.x then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid <= 1 and sqm then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 919 then return false end
if isInArray({4820, 4821, 4822, 4823, 4824, 4825}, getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false end
    local n = not proj and 3 or 2                                    --alterado v1.6
    for i = 0, 255 do
        pos.stackpos = i                           
        local tile = getTileThingByPos(pos)        
        if tile.itemid ~= 0 and i ~= 253 and not isCreature(tile.uid) then     --edited
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end   
return true
end

function canWalkOnPos2(pos, creature, pz, water, sqm, proj)     --alterado v1.6
if not pos then return false end
if not pos.x then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid <= 1 and sqm then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 919 then return false end
if isInArray({4820, 4821, 4822, 4823, 4824, 4825}, getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false end
    --[[local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i                           --edited pra retirar um bug.. ;x
        local tile = getTileThingByPos(pos)        
        if tile.itemid ~= 0 and i ~= 253 and not isCreature(tile.uid) then     --edited
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end ]]  
return true
end

function getFreeTile(pos, cid)
	if canWalkOnPos(pos, true, false, true, true, false) then
		return pos
	end
	local positions = {}
	for a = 0, 7 do
		if canWalkOnPos(getPosByDir(pos, a), true, false, true, true, false) then
		table.insert(positions, pos)
		end
	end
	if #positions >= 1 then
		if isCreature(cid) then
			local range = 1000
			local ret = getThingPos(cid)
			for b = 1, #positions do
				if getDistanceBetween(getThingPos(cid), positions[b]) < range then
					ret = positions[b]
					range = getDistanceBetween(getThingPos(cid), positions[b])
				end
			end
			return ret
		else
			return positions[math.random(#positions)]
		end
	end
return getThingPos(cid)
end

function isWalkable(pos, creature, proj, pz, water)-- by Nord
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
    if getTopCreature(pos).uid > 0 and creature then return false end
    if getTileInfo(pos).protection and pz then return false, true end
    local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i
        local tile = getTileThingByPos(pos)
        if tile.itemid ~= 0 and not isCreature(tile.uid) then
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end
    return true
end


function isPlayerSummon(cid, uid)
return getCreatureMaster(uid) == cid  --alterado v1.9
end

function isSummon(sid)
return isCreature(sid) and getCreatureMaster(sid) ~= sid and isPlayer(getCreatureMaster(sid))   --alterado v1.9
end 

function getItemsInContainerById(container, itemid) -- Function By Kydrai
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
   for slot=0, (getContainerSize(container)-1) do
       local item = getContainerItem(container, slot)
       if isContainer(item.uid) then
          local itemsbag = getItemsInContainerById(item.uid, itemid)
          for i=0, #itemsbag do
              table.insert(items, itemsbag[i])
          end
       else
          if itemid == item.itemid then
             table.insert(items, item.uid)
          end
       end
   end
end
return items
end

function getPokeballsInContainer(container) -- Function By Kydrai
	if not isContainer(container) then return {} end
	local items = {}
	if isContainer(container) and getContainerSize(container) > 0 then
		for slot=0, (getContainerSize(container)-1) do
			local item = getContainerItem(container, slot)
				if isContainer(item.uid) then
					local itemsbag = getPokeballsInContainer(item.uid)
					for i=0, #itemsbag do
						table.insert(items, itemsbag[i])
					end
				elseif isPokeball(item.itemid) then
					table.insert(items, item.uid)
				end
		end
	end
return items
end

function getItensUniquesInContainer(container)    --alterado v1.6
if not isContainer(container) then return {} end
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
   for slot=0, (getContainerSize(container)-1) do
       local item = getContainerItem(container, slot)
       if isContainer(item.uid) then
          local itemsbag = getItensUniquesInContainer(item.uid)
          for i=0, #itemsbag do
	          table.insert(items, itemsbag[i])
          end
       elseif getItemAttribute(item.uid, "unique") then
          table.insert(items, item)
       end
   end
end
return items
end

function hasSpaceInContainer(container)                --alterado v1.6
if not isContainer(container) then return false end
if getContainerSize(container) < getContainerCap(container) then return true end

for slot = 0, (getContainerSize(container)-1) do
    local item = getContainerItem(container, slot)
    if isContainer(item.uid) then
       if hasSpaceInContainer(item.uid) then
          return true
       end
    end
end
return false
end

function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo
local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
   for i,x in pairs(item) do
       if getThing(x).type < 100 then
          local it = getThing(x)
          doTransformItem(it.uid, itemid, it.type+quant)
          if it.type+quant > 100 then
             doPlayerAddItem(cid, itemid, it.type+quant-100)
          end
       else
          piles = piles+1
       end
   end
else
   return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
   doPlayerAddItem(cid, itemid, quant)
end
end

function getPlayerInArea(fromPos, toPos) -- by jhon992
local online = getPlayersOnline()
local players = {}
for i=1, #online do
    if isInArea(getPlayerPosition(online[i]), fromPos, toPos) then
        players[#players+1] = online[i]
    end
end
return players
end
function isPlayerOnline(uid)
	return isInArray(getPlayersOnline(), uid)
end

function doRegenerateWithY(cid, sid)
if isPlayerOnline(cid) then
local ball = getPlayerSlotItem(cid, 8) or getPlayerSlotItem(getCreatureMaster(cid), 8)
local Tiers = {
[1] = {bonus = Regen1},
[2] = {bonus = Regen2},
[3] = {bonus = Regen3},
[4] = {bonus = Regen4},
[5] = {bonus = Regen5},
[6] = {bonus = Regen6},
[7] = {bonus = Regen7},
}
if isPlayer(cid) and #getCreatureSummons(cid) > 0 then
local Tier = getItemAttribute(ball.uid, "heldy")
if Tier and Tier > 0 and Tier < 8 then
if not getCreatureCondition(cid, CONDITION_INFIGHT) then
if getCreatureHealth(sid) < getCreatureMaxHealth(sid) then
addEvent(function() doCreatureAddHealth(sid,Tiers[Tier].bonus) doSendAnimatedText(getThingPos(sid), "+ "..Tiers[Tier].bonus, 30) end, 0)
end
addEvent(doRegenerateWithY, 1000, cid, sid)  
else
addEvent(doRegenerateWithY, 1000, cid, sid)
end
end   
end
end 
end

function doCureWithY(cid, sid)
if isPlayerOnline(cid) then
local ball = getPlayerSlotItem(cid, 8) or getPlayerSlotItem(getCreatureMaster(cid), 8)
local Tiers = {
[8] = {chance = Cure1},
[9] = {chance = Cure2},
[10] = {chance = Cure3},
[11] = {chance = Cure4},
[12] = {chance = Cure5},
[13] = {chance = Cure6},
[14] = {chance = Cure7},
}
local Tier = getItemAttribute(ball.uid, "heldy")
if isPlayer(cid) and #getCreatureSummons(cid) > 0  and Tier then
if Tier > 7 and Tier < 15 then
if math.random(1,100) <= Tiers[Tier].chance then
doCureStatus(sid, "all")
doSendMagicEffect(getThingPosWithDebug(sid), 14)
end
addEvent(doCureWithY, 1000, cid, sid)  
end
end
end   
end
function doPlayerAddItemStacking(cid, itemid, quant)


local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
for i,x in pairs(item) do
if getThing(x).type < 100 then
local it = getThing(x)
doTransformItem(it.uid, itemid, it.type+quant)
if it.type+quant > 100 then
doPlayerAddItem(cid, itemid, it.type+quant-100)
end
else
piles = piles+1
end
break
end
else
return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
doPlayerAddItem(cid, itemid, quant)
end
end

function getDirectionToWalk(p1, pos2)
	local dir = NORTH
	local pos1 = getCreaturePosition(p1)
	if(pos1.x > pos2.x) then
		dir = WEST
		if(pos1.y > pos2.y) then
			dir = NORTHWEST
		elseif(pos1.y < pos2.y) then
			dir = SOUTHWEST
		end
	elseif(pos1.x < pos2.x) then
		dir = EAST
		if(pos1.y > pos2.y) then
			dir = NORTHEAST
		elseif(pos1.y < pos2.y) then
			dir = SOUTHEAST
		end
	else
		if(pos1.y > pos2.y) then
			dir = NORTH
		elseif(pos1.y < pos2.y) then
			dir = SOUTH
		end
	end
	return dir
end

 function getNextStepDelay(cid, dir)
            return tonumber(398)
    end	  
	
	
	function getRecorderPlayer(pos, cid)
	local ret = 0
	if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
	   return cid
	end
	local s = {}
	s.x = pos.x
	s.y = pos.y
	s.z = pos.z
		for a = 0, 255 do
			s.stackpos = a
			local b = getTileThingByPos(s).uid
			if b > 1 and isPlayer(b) and getCreatureOutfit(b).lookType ~= 814 then
				ret = b
			end
		end
return ret
end

function getRecorderCreature(pos, cid)
	local ret = 0
	if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
	   return cid
	end
	local s = {}
	s.x = pos.x
	s.y = pos.y
	s.z = pos.z
		for a = 0, 255 do
			s.stackpos = a
			local b = getTileThingByPos(s).uid
			if b > 1 and isCreature(b) and getCreatureOutfit(b).lookType ~= 814 then
				ret = b
			end
		end
return ret
end

function hasTile(pos)    --Verifica se tem TILE na pos
pos.stackpos = 0
if getTileThingByPos(pos).itemid >= 1 then
   return true
end
return false
end
function doPlayerAddItemStacking(cid, itemid, quant)


local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
for i,x in pairs(item) do
if getThing(x).type < 100 then
local it = getThing(x)
doTransformItem(it.uid, itemid, it.type+quant)
if it.type+quant > 100 then
doPlayerAddItem(cid, itemid, it.type+quant-100)
end
else
piles = piles+1
end
break
end
else
return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
doPlayerAddItem(cid, itemid, quant)
end
end

function isFly(cid)
   if getPlayerStorageValue(cid, orderTalks["fly"].storage) == 1 then
      return true 
   end
   return false
end


function doOTCSendPokemonHealth(cid)
	local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET)
	local pokemon = getCreatureSummons(cid)
	if not ball.uid or ball.uid <= 1 then
		return doSendPlayerExtendedOpcode(cid, 122, "0|0")
	end
	if #pokemon >= 1 then
		return doSendPlayerExtendedOpcode(cid, 122, getCreatureHealth(pokemon[1]).."|"..getCreatureMaxHealth(pokemon[1]))
	end
end

some functions.lua /\

Vou colocar em spoiler porque a página buga quando tem muitos texto grandes:

 

Spoiler

function getStringOfTaskArray(array)
   if type(array) ~= 'table' or not next(array) then return "" end
   
   local result = {}
    for _, value in ipairs(array) do
        local thing, num = (type(value[1]) == 'string' and value[1] or getItemNameById(value[1])), value[2]
        table.insert(result, (_ == 1 and "" or ", ")..num.." "..thing..(num == 1 and "" or "s"))
    end
    result[#result] = " and"..(result[#result]:sub(2,#result[#result]))
    return table.concat(result)
end

function getVitalityByMaster(cid)
if not isCreature(cid) then return 0 end
local ball = getPlayerSlotItem(cid, 8).uid
if not ball or ball <= 1 or not pokes[getItemAttribute(ball, 'poke')] then return true end
   return pokes[getItemAttribute(ball, 'poke')].vitality * (getPlayerLevel(cid) + (getItemAttribute(ball, 'boost') or 0))
end

function onPokeHealthChange(cid, zerar)
   if not isCreature(cid) then return true end
   if zerar then doPlayerSendCancel(cid, '#ph#,0,0') end
   local ball = getPlayerSlotItem(cid, 8).uid
   if not ball or ball <= 1 or not pokes[getItemAttribute(ball, 'poke')] then return true end
   
   if #getCreatureSummons(cid) >= 1 and getPlayerStorageValue(cid, 212124) <= 0 then   --alterado v1.6
      local pokemon = getCreatureSummons(cid)[1]
      local pokelife = (getCreatureHealth(pokemon) / getCreatureMaxHealth(pokemon))
      doItemSetAttribute(ball, "hp", pokelife)
   end
   
      local rd = 1 - (tonumber(getItemAttribute(ball, "hp")))
   local maxHp = HPperVITsummon * getVitalityByMaster(cid) 
   local hp = maxHp -(maxHp * rd)   
   doPlayerSendCancel(cid, '#ph#,'.. math.floor(hp) ..','.. math.floor(maxHp))
end

function addPokeToPlayer(cid, pokemon, boost, gender, ball)             --alterado v1.9 \/ peguem ele todo...
local genders = {
["male"] = 4,
["female"] = 3,
[1] = 4,
[0] = 3,
[4] = 4,
[3] = 3,
}
if not isCreature(cid) then return false end

local pokemon = doCorrectString(pokemon)
if not pokes[pokemon] then return false end

   local GENDER = (gender and genders[gender]) and genders[gender] or getRandomGenderByName(pokemon)
   local btype = (ball and pokeballs[ball]) and ball or isShinyName(pokemon) and "shinynormal" or "normal"
   local happy = 250
   
   if icons[pokemon] then
      id = icons[pokemon].on
   else
      id = pokeballs[btype].on
   end

   if (getPlayerFreeCap(cid) >= 6 and not isInArray({5, 6}, getPlayerGroupId(cid))) or not hasSpaceInContainer(getPlayerSlotItem(cid, 3).uid) then 
      item = doCreateItemEx(id)
   else
      item = addItemInFreeBag(getPlayerSlotItem(cid, 3).uid, id, 1)   
   end
   if not item then return false end

   doItemSetAttribute(item, "poke", pokemon)
   doItemSetAttribute(item, "hp", 1)
   doItemSetAttribute(item, "happy", happy)
   --doItemSetAttribute(item, "-1", GENDER)
   doSetItemAttribute(item, "hands", 0)
   doItemSetAttribute(item, "description", "Contains a "..pokemon..".")
   doItemSetAttribute(item, "fakedesc", "Contains a "..pokemon..".") 
   doItemSetAttribute(item, "defeated", "no")
   doItemSetAttribute(item, "ball", btype)
   doItemSetAttribute(item, "tadport", fotos[pokemon])
   if boost and tonumber(boost) and tonumber(boost) > 0 and tonumber(boost) <= 50 then
      doItemSetAttribute(item, "boost", boost)
   end
   if unique then
      doItemSetAttribute(item, "unique", getCreatureName(cid))
   end
                                                                             
   if (getPlayerFreeCap(cid) >= 6 and not isInArray({5, 6}, getPlayerGroupId(cid))) or not hasSpaceInContainer(getPlayerSlotItem(cid, 3).uid) then
      doPlayerSendMailByName(getCreatureName(cid), item, 1)
      sendMsgToPlayer(cid, 27, "You are already holding six pokemons, so your new pokemon was sent to your depot.")
   end
   doTransformItem(item, id)
return true
end 
---------------------------

function unLock(ball)                                                             
if not ball or ball <= 0 then return false end
if getItemAttribute(ball, "lock") and getItemAttribute(ball, "lock") > 0 then
   local vipTime = getItemAttribute(ball, "lock")
   local timeNow = os.time()
   local days = math.ceil((vipTime - timeNow)/(24 * 60 * 60))
   if days <= 0 then
      doItemEraseAttribute(ball, "lock")    
      doItemEraseAttribute(ball, "unique")
      return true
   end
end
return false
end

function getGuildMembersOnline(GuildId)
local players = {}
for _, pid in pairs(getPlayersOnline()) do
    if getPlayerGuildId(pid) == tonumber(GuildId) then
       table.insert(players, pid)
    end
end                                                   --by Vodkart
return #players > 0 and players or false
end

function getGuildMembers(GuildId)
local players,query = {},db.getResult("SELECT `name` FROM `players` WHERE `rank_id` IN (SELECT `id` FROM `guild_ranks` WHERE `guild_id` = " .. GuildId .. ");")
if (query:getID() ~= -1) then  
   repeat
         table.insert(players,query:getDataString("name"))
   until not query:next()                           --by Vodkart
   query:free()
end
return #players > 0 and players or false
end 
--/////////////////////////////////////////////////////////////////////////////////---
function sendMsgToPlayer(cid, tpw, msg)      --alterado v1.7 \/\/\/
if not isCreature(cid) or not tpw or not msg then return true end
return doPlayerSendTextMessage(cid, tpw, msg)
end

function getPlayerDesc(cid, thing, TV)
if (not isCreature(cid) or not isCreature(thing)) and not TV then return "" end

local pos = getThingPos(thing)
local ocup = youAre[getPlayerGroupId(thing)]
local rank = (getPlayerStorageValue(thing, 86228) <= 0) and "a Pokemon Trainer" or lookClans[getPlayerStorageValue(thing, 86228)][getPlayerStorageValue(thing, 862281)]
local name = thing == cid and "yourself" or getCreatureName(thing)     
local art = thing == cid and "You are" or (getPlayerSex(thing) == 0 and "She is" or "He is")
   
local str = {}
table.insert(str, "You see "..name..". "..art.." ")
if youAre[getPlayerGroupId(thing)] then
   table.insert(str, (ocup).." and "..rank.." from ".. getTownName(getPlayerTown(thing))..".")       
else
   table.insert(str, (rank).." from ".. getTownName(getPlayerTown(thing))..".")
end
if getPlayerGuildId(thing) > 0 then
   table.insert(str, " "..art.." "..getPlayerGuildRank(thing).." from the "..getPlayerGuildName(thing)..".")
end
if TV then
   table.insert(str, " "..art.." watching TV.")
end
table.insert(str, ((isPlayer(cid) and youAre[getPlayerGroupId(cid)]) and "\nPosition: [X: "..pos.x.."][Y: "..pos.y.."][Z: "..pos.z.."]" or "")) 

return table.concat(str) 
end

function doRevivePokemon(cid, pokemon)
  if getPlayerItemCount(cid, 12344) <= 0 then return doPlayerSendCancel(cid, "Voce nao tem nenhum revive.") end
  local cooldownMoves = {
    ["Selfdestruct"] = 30,
    ["Selfdestruction"] = 30,
  }
  local balls = getPokeballsInContainerNew(getPlayerSlotItem(cid, 3).uid)
  if isPokeball(getPlayerSlotItem(cid, CONST_SLOT_FEET).itemid) then
    table.insert(balls, getPlayerSlotItem(cid, CONST_SLOT_FEET))
  end
  for i =1, #balls do
    local ball = balls
    -- print("Pokemon: "..pokemon.." attrpoke> "..(getItemAttribute(ball.uid, "poke") or "sempoke").." attrnick> "..(getItemAttribute(ball.uid, "nick") or "sem nick"))
    if getItemAttribute(ball.uid, "poke") == pokemon or getItemAttribute(ball.uid, "nick") == pokemon then
      -- print("IGUAL")
      for type, index in pairs(pokeballs) do
        -- print(index.on.." / "..index.off)
        if ball.itemid == index.on or ball.itemid == index.off then
          -- print("revive")
          doTransformItem(ball.uid, index.on)
          doSetItemAttribute(ball.uid, "hp", 1)
          local name = getItemAttribute(ball.uid, "poke")
          for c = 1, 15 do
            local str = "move"..c
            local move = movestable[name][str]; move = move and cooldownMoves[move.name]
            setCD(ball.uid, str, move or 0)
          end
          setCD(ball.uid, "control", 0)
          setCD(ball.uid, "blink", 0) --alterado v1.6
          doSendMagicEffect(getThingPos(cid), 13)
          doPlayerRemoveItem(cid, 12344, 1)
          doCureBallStatus(ball.uid, "all")
          doUpdatePokemonsBar(cid)
          cleanBuffs2(ball.uid) --alterado v1.5
          return
        end
      end
    end
  end
end

function getPokeballsInContainerNew(container)
  if not isContainer(container) then return {} end
  local items = {}
  if isContainer(container) and getContainerSize(container) > 0 then
      for slot=0, (getContainerSize(container)-1) do
      local item = getContainerItem(container, slot)
      if isContainer(item.uid) then
          local itemsbag = getPokeballsInContainerNew(item.uid)
          for i=0, #itemsbag do
          table.insert(items, itemsbag)
          end
      elseif isPokeball(item.itemid) then
          table.insert(items, item)
      end
      end
  end
  return items
end

-------------------------------------------------------------------------------------------------   /\/\
function getLivePokeballs(cid, container, duel) 
    if not isCreature(cid) then return {} end     
    if not isContainer(container) then return {} end
    local items = {}
    ---
    local ballSlot = getPlayerSlotItem(cid, ?
    if ballSlot.uid ~= 0 then
       for a, b in pairs (pokeballs) do
           if ballSlot.itemid == b.on or ballSlot.itemid == b.use then
              if duel and getPlayerLevel(cid) >= (pokes[getItemAttribute(ballSlot.uid, "poke")].level + getPokeballBoost(ballSlot)) then
                 table.insert(items, ballSlot.uid)                                                                      --alterado v1.8
              elseif not duel then
                 table.insert(items, ballSlot.uid)
              end
           end
       end
    end
    ---     
    if isContainer(container) and getContainerSize(container) > 0 then      
        for slot=0, (getContainerSize(container)-1) do
            local item = getContainerItem(container, slot)
                if isContainer(item.uid) then
                    local itemsbag = getPokeballsInContainer(item.uid)
                    for i=0, #itemsbag do
                        if not isInArray(items, itemsbag) then
                           table.insert(items, itemsbag)
                        end
                    end
                elseif isPokeball(item.itemid) then
                    for a, b in pairs (pokeballs) do
                        if item.itemid == b.on then
                           if duel and getPlayerLevel(cid) >= (pokes[getItemAttribute(item.uid, "poke")].level + getPokeballBoost(item)) then    
                              table.insert(items, item.uid)                                            --alterado v1.8
                           elseif not duel then
                              table.insert(items, item.uid)
                           end
                        end
                    end
                end
        end
    end
return items
end

function addItemInFreeBag(container, item, num)
if not isContainer(container) or not item then return false end                                             
if not num or num <= 0 then num = 1 end                                            --alterado v1.6.1
if getContainerSize(container) < getContainerCap(container) then
   return doAddContainerItem(container, item, num)
else
   for slot = 0, (getContainerSize(container)-1) do
       local container2 = getContainerItem(container, slot)
       if isContainer(container2.uid) and getContainerSize(container2.uid) < getContainerCap(container2.uid) then
          return doAddContainerItem(container2.uid, item, num)
       end
   end
end
return false
end
------------------------------------------------------------------------------------------------------
function pokeHaveReflect(cid)
if not isCreature(cid) then return false end
local table = getTableMove(cid, "Reflect")
if table and table.name then     --alterado v1.6
   return true 
end
return false
end
------------------------------------------------------------------------------------------------------
function nextHorario(cid)
    horarioAtual = os.date("%X")
    horario = string.explode(horarioAtual, ":")
    
    for i = 1, #horas do
        horarioComparacao = horas
        horarioComp = string.explode(horarioComparacao, ":")
        ---------------
        if tonumber(horarioComp[1]) > tonumber(horario[1]) then
           return horarioComparacao                                
        elseif tonumber(horarioComp[1]) == tonumber(horario[1]) and tonumber(horario[2]) < tonumber(horarioComp[2]) then
           return horarioComparacao
        end
    end 
    return horas[1]                                  
end                                                               

function getTimeDiff(timeDiff)
local dateFormat = {
{'hour', timeDiff / 60 / 60}, --6%
{'min', timeDiff / 60 % 60},
}
local out = {}                                   
for k, t in ipairs(dateFormat) do
    local v = math.floor(t[2])
    if(v > -1) then
         table.insert(out, (k < #dateFormat and '' or ' and ') .. v .. '' .. (v <= 1 and t[1] or t[1].."s"))
    end
end
if tonumber(dateFormat[1][2]) == 0 and tonumber(dateFormat[2][2]) == 0 then
   return "seconds"
end
return table.concat(out)
end

function getTimeDiff2(timeDiff)
local dateFormat = {
{'hour', timeDiff / 60 / 60}, --6%
{'min', timeDiff / 60 % 60},
{'sec', timeDiff % 60},
}
local out = {}                                  
for k, t in ipairs(dateFormat) do
    local v = math.floor(t[2])
    if(v > 0) then
         table.insert(out, (k < #dateFormat and ' ' or ' and ') .. v .. '' .. (v <= 1 and t[1] or t[1].."s"))
    end
end
return table.concat(out)
end 

function showTimeDiff(timeComp)
local b = string.explode(os.date("%X"), ":")
local c = string.explode(timeComp, ":")
    ---
    local d, m, y = os.date("%d"), os.date("%m"), os.date("%Y")
    local hAtual, mAtual = tonumber(b[1]), tonumber(b[2])
    local hComp, mComp = tonumber(c[1]), tonumber(c[2])
    ---
    local t = os.time{year= y, month= m, day= d, hour= hAtual, min= mAtual}
    local t1 = os.time{year= y, month= m, day= d, hour= hComp, min= mComp}
    ---                                                                       
    comparacao = t1-t
    if hComp < hAtual then
       v = os.time{year= y, month= m, day= d, hour= 24, min= 0}
       v2 = os.time{year= y, month= m, day= d, hour= 0, min= 0}
       comparacao = (v-t)+(t1-v2)
    end
return getTimeDiff(comparacao)
end
-------------------------------------------------------------------------
function cleanCMcds(item)
if item ~= 0 then
   for c = 1, 15 do              --alterado v1.5
      local str = "cm_move"..c
      setCD(item, str, 0)
   end
end
end

function ehNPC(cid)   --alterado v1.9
return isCreature(cid) and not isPlayer(cid) and not isSummon(cid) and not isMonster(cid)
end

function ehMonstro(cid)
local eh = false
    if not isSummon(cid) and not ehNPC(cid) and not isPlayer(cid) then
        eh = true
    end
    return eh
end                                                      --alterado v1.9.1 /\

function doAppear(cid) --Faz um poke q tava invisivel voltar a ser visivel...
if not isCreature(cid) then return true end
doRemoveCondition(cid, CONDITION_INVISIBLE)
doRemoveCondition(cid, CONDITION_OUTFIT)
doCreatureSetHideHealth(cid, false)
end

function doDisapear(cid)   --Faz um pokemon ficar invisivel
if not isCreature(cid) then return true end
doCreatureAddCondition(cid, permanentinvisible)
doCreatureSetHideHealth(cid, true)
doSetCreatureOutfit(cid, {lookType = 2}, -1)
end

function getThingFromPosWithProtect(pos)  --Pega uma creatura numa posiçao com proteçoes
if hasTile(pos) then
   if isCreature(getRecorderCreature(pos)) then
      return getRecorderCreature(pos)
   else
      pos.stackpos = 253
      pid = getThingfromPos(pos).uid
   end
else
   pid = getThingfromPos({x=1,y=1,z=10,stackpos=253}).uid
end
return pid
end

function getTileThingWithProtect(pos)    --Pega um TILE com proteçoes
if hasTile(pos) then
pos.stackpos = 0
   pid = getTileThingByPos(pos)
else
   pid = getTileThingByPos({x=1,y=1,z=10,stackpos=0})
end
return pid
end

function canAttackOther(cid, pid)         --Function q verifica se um poke/player pode atacar outro poke/player

if not isCreature(cid) or not isCreature(pid) then return "Cant" end

local master1 = isSummon(cid) and getCreatureMaster(cid) or cid
local master2 = isSummon(pid) and getCreatureMaster(pid) or pid
   
   ----             
   if getPlayerStorageValue(master1, 6598754) >= 5 and getPlayerStorageValue(master2, 6598754) >= 5 then
      if getPlayerStorageValue(master1, 6598754) ~= getPlayerStorageValue(master2, 6598754) then
         if isDuelingAgainst(master1, master2) then   --alterado v1.8
            if isSummon(cid) and isPlayer(pid) then
               return "Cant"
            else
               return "Can"
            end
         end
      end
   end
   ----              pvp system
   if getPlayerStorageValue(master1, 6598754) >= 1 and getPlayerStorageValue(master2, 6598755) >= 1 then
      return "Can" 
   end
   if getPlayerStorageValue(master1, 6598755) >= 1 and getPlayerStorageValue(master2, 6598754) >= 1 then  ---estar em times diferentes
      return "Can"
   end
   ----
if getTileInfo(getThingPos(cid)).pvp then

return "Can"

end

   if ehMonstro(cid) or ehMonstro(pid) then
      return "Can"
   end

return "Cant"
end
   
      
function stopNow(cid, time)   
if not isCreature(cid) or not tonumber(time) or isSleeping(cid) then return true end
                                                        --alterado v1.9.1 \/
local function podeMover(cid)                         
if isPlayer(cid) then 
   mayNotMove(cid, false) 
elseif isCreature(cid) then 
   doRegainSpeed(cid) 
end
end

if isPlayer(cid) then mayNotMove(cid, true) else doChangeSpeed(cid, -getCreatureSpeed(cid)) end
addEvent(podeMover, time, cid)
end

function doReduceStatus(cid, off, def, agi)   --reduz os status
if not isCreature(cid) then return true end
local A = getOffense(cid)
local B = getDefense(cid)
local C = getSpeed(cid)

if off > 0 then
   setPlayerStorageValue(cid, 1001, A - off)
end
if def > 0 then
   setPlayerStorageValue(cid, 1002, B - def)
end
if agi > 0 then
   setPlayerStorageValue(cid, 1003, C - agi)
   if getCreatureSpeed(cid) ~= 0 then
      doRegainSpeed(cid)
   end                                              --alterado v1.5  functions arrumadas...
end
end

function doRaiseStatus(cid, off, def, agi, time)  
if not isCreature(cid) then return true end
local A = getOffense(cid)
local B = getDefense(cid)
local C = getSpeed(cid)

if off > 0 then
   setPlayerStorageValue(cid, 1001, A * off)
end
if def > 0 then
   setPlayerStorageValue(cid, 1002, B * def)
end
if agi > 0 then
   setPlayerStorageValue(cid, 1003, C + agi)
   if getCreatureSpeed(cid) ~= 0 then
      doRegainSpeed(cid)
   end
end

local D = getOffense(cid)
local E = getDefense(cid)
local F = getSpeed(cid)
---------------------------
local G = D - A
local H = E - B
local I = F - C

addEvent(doReduceStatus, time*500, cid, G, H, I)
end


function BackTeam(cid)          
  if isCreature(cid) then
     local summon = getCreatureSummons(cid)   --alterado v1.6
     for i = 2, #summon do
         doSendMagicEffect(getThingPos(summon), 211)
         doRemoveCreature(summon)
     end
     setPlayerStorageValue(cid, 637501, -1)
  end  
end
    
function choose(...) -- by mock
    local arg = {...}
    return arg[math.random(1,#arg)]
end

function AddPremium(cid, days)
local function removerPlayer(cid)
if isCreature(cid) then
   doRemoveCreature(cid)
end
end

db.executeQuery("UPDATE `accounts` SET `premdays` = '"..days.."' WHERE `accounts`.`id` = ".. getPlayerAccountId(cid) ..";")
doPlayerSendTextMessage(cid,25,"Você será kickado em 5 segundos.")    
addEvent(removerPlayer, 5*1000, cid)     
return TRUE
end

function isShiny(cid) 
return isCreature(cid) and string.find(getCreatureName(cid), "Shiny")  --alterado v1.9
end

function isShinyName(name)        
return tostring(name) and string.find(doCorrectString(name), "Shiny") --alterado v1.9
end

function doConvertTypeToStone(type, string)
local t = {
["fly"] = {heart, "heart"},
["flying"] = {heart, "heart"},
["normal"] = {heart, "heart"},
["fire"] = {fire, "fire"},
["grass"] = {leaf, "leaf"},
["leaf"] = {leaf, "leaf"},
["water"] = {water, "water"},
["poison"] = {venom, "venom"},
["venom"] = {venom, "venom"},
["electric"] = {thunder, "thunder"},
["thunder"] = {thunder, "thunder"},
["rock"] = {rock, "rock"},
["fight"] = {punch, "punch"},
["fighting"] = {punch, "punch"},
["bug"] = {coccon, "coccon"},
["dragon"] = {crystal, "crystal"},
["dark"] = {dark, "dark"},
["ghost"] = {dark, "dark"},
["ground"] = {earth, "earth"},
["earth"] = {earth, "earth"},
["psychic"] = {enigma, "enigma"},
["steel"] = {metal, "metal"},
["ancient"] = {ancient, "ancient"},
["metal"] = {metal, "metal"},
["ice"] = {ice, "ice"},
["boost"] = {boostStone, "boost"},  --alterado v1.9
}

if string then
return t[type][2]
else
return t[type][1]
end
end

function doConvertStoneIdToString(stoneID)
local t = {
[11453] = "Heart Stone",
[11441] = "Leaf Stone",
[11442] = "Water Stone",
[11443] = "Venom Stone",
[11444] = "Thunder Stone",
[11445] = "Rock Stone",
[11446] = "Punch Stone", 
[11447] = "Fire Stone",               --alterado v1.6
[11448] = "Cocoon Stone", 
[11449] = "Crystal Stone",
[11450] = "Darkess Stone", 
[11451] = "Earth Stone",
[11452] = "Enigma Stone",
[11454] = "Ice Stone", 
[12244] = "Ancient Stone",
[12232] = "Metal Stone",
[12401] = "Shiny Fire Stone",
[12402] = "Shiny Water Stone",
[12403] = "Shiny Leaf Stone",
[12404] = "Shiny Heart Stone",
[12405] = "Shiny Enigma Stone",
[12406] = "Shiny Rock Stone",
[12407] = "Shiny Venom Stone", 
[12408] = "Shiny Ice Stone",
[12409] = "Shiny Thunder Stone",
[12410] = "Shiny Crystal Stone",
[12411] = "Shiny Cocoon Stone",
[12412] = "Shiny Darkness Stone",
[12413] = "Shiny Punch Stone",
[12414] = "Shiny Earth Stone",
[boostStone] = "Boost Stone",  --alterado v1.9
[20897] = "Virus",
[20898] = "Glice Stone",
[20899] = "Green Stone",
[20900] = "Mag Stone",
[20901] = "Electri Stone",
[20902] = "Perior Stone",
[20903] = "Kiss Stone",
[20904] = "Shiny Stone",
[20905] = "Zone Stone",
[21996] = "Llade Stone",
[21997] = "Scor Stone",
[21998] = "Licky Stone",
[21999] = "Poryz Stone",
[22000] = "Probo Stone",
[22001] = "Wea Stone",
[22002] = "Yanm Stone",
[22003] = "Fros Stone",
[22004] = "Special Stone",
[22067] = "Super Darkness Stone",
[22068] = "Super Ice Stone",
[22071] = "Super Fire Stone",
[22072] = "Super Water Stone",
}
if t[stoneID] then
return t[stoneID]
else
return ""
end
end

function isStone(id)
if id >= leaf and id <= ice then
return true
end
if id == boostStone then  --alterado v1.9
return true
end
if id == 12232 or id == 12244 or id == 12244 or id == 12245 then
return true                                 
end
if id == 20904 then
return true                                 
end
if (id >= sfire and id <= searth) or id == 12417 or id == 12419 then
return true 
end
return false
end

function isWater(id)
return tonumber(id) and id >= 4820 and id <= 4825 --alterado v1.9
end

function getTopCorpse(position)
local pos = position
for n = 1, 255 do
    pos.stackpos = n
    local item = getTileThingByPos(pos)
    if item.itemid >= 2 and (string.find(getItemNameById(item.itemid), "fainted ") or string.find(getItemNameById(item.itemid), "defeated ")) then
       return getTileThingByPos(pos)
    end
end
return null
end

bpslot = CONST_SLOT_BACKPACK

function hasPokemon(cid)
    if not isCreature(cid) then return false end
    if getCreatureMana(cid) <= 0 then return false end
    if #getCreatureSummons(cid) >= 1 then return true end
    local item = getPlayerSlotItem(cid, CONST_SLOT_FEET)
    local bp = getPlayerSlotItem(cid, bpslot)
    for a, b in pairs (pokeballs) do
        if item.itemid == b.on or item.itemid == b.use then
        return true                              --alterado v1.4
        end
        if #getItemsInContainerById(bp.uid, b.on) >= 1 then
        return true
        end
    end
return false
end

function isNpcSummon(cid)
return isNpc(getCreatureMaster(cid))
end

--function getPokemonHappinessDescription(cid)
--    if not isCreature(cid) then return true end
--    local str = {}
    --if getPokemonGender(cid) == SEX_MALE then
    --    table.insert(str, "He")
    --elseif getPokemonGender(cid) == SEX_FEMALE then
    --    table.insert(str, "She")
    --else
    --    table.insert(str, "It")
    --end
    --local h = getPlayerStorageValue(cid, 1008)
--    if h >= tonumber(getConfigValue('PokemonStageVeryHappy')) then
--        table.insert(str, " is very happy with you!")
--    elseif h >= tonumber(getConfigValue('PokemonStageHappy')) then
--        table.insert(str, " is happy.")
--    elseif h >= tonumber(getConfigValue('PokemonStageOK')) then
--        table.insert(str, " is unhappy.")
--    elseif h >= tonumber(getConfigValue('PokemonStageSad')) then
--        table.insert(str, " is sad.")
--    elseif h >= tonumber(getConfigValue('PokemonStageMad')) then
--        table.insert(str, " is mad.")
--    else
--        table.insert(str, " is very mad at you!")
--    end
--return table.concat(str)
--end

function doSetItemAttribute(item, key, value)
doItemSetAttribute(item, key, value)
end

function deTransform(cid, check)
    if not isCreature(cid) then return true end

    local m = getCreatureMaster(cid)
    local p = getPlayerSlotItem(m, ?

    if getItemAttribute(p.uid, "transTurn") ~= check then return true end

    setPlayerStorageValue(cid, 1010, getCreatureName(cid) == "Ditto" and "Ditto" or "Shiny Ditto")        --edited
    doRemoveCondition(cid, CONDITION_OUTFIT)
    doSendMagicEffect(getThingPos(cid), 184)
    doCreatureSay(cid, "DITTO!", TALKTYPE_MONSTER)
    doItemSetAttribute(p.uid, "transBegin", 0)
    doItemSetAttribute(p.uid, "transLeft", 0)
    doItemEraseAttribute(p.uid, "transName")
    adjustStatus(cid, p.uid, true, true, true)
end

function isTransformed(cid)
return isCreature(cid) and not isInArray({-1, "Ditto", "Shiny Ditto"}, getPlayerStorageValue(cid, 1010))  --alterado v1.9
end

function doSendFlareEffect(pos)
    local random = {28, 29, 79}
    doSendMagicEffect(pos, random[math.random(1, 3)])
end

function isDay()
    local a = getWorldTime()
    if a >= 360 and a < 1080 then
    return true
    end
return false
end

function doPlayerSendTextWindow(cid, p1, p2)
    if not isCreature(cid) then return true end
    local item = 460
    local text = ""
    if type(p1) == "string" then
        doShowTextDialog(cid, item, p1)
    else
        doShowTextDialog(cid, p1, p2)
    end
end

function getClockString(tw)
    local a = getWorldTime()
    local b = a / 60
    local hours = math.floor(b)
    local minut = a - (60 * hours)

    if not tw then
        if hours < 10 then
            hours = "0"..hours..""
        end
        if minut < 10 then
            minut = "0"..minut..""
        end
    return hours..":"..minut
    else
        local sm = "a.m"
        if hours >= 12 then
            hours = hours - 12
            sm = "p.m"
        end
        if hours < 10 then
            hours = "0"..hours..""
        end
        if minut < 10 then
            minut = "0"..minut..""
        end
    return hours..":"..minut.." "..sm
    end
end

function doCorrectPokemonName(poke)
return doCorrectString(poke)
end

function doCorrectString(str)
local name = str:explode(" ")  --alterado v1.9
local final = {}
for _, s in ipairs(name) do
    table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower())
end
return table.concat(final, (name[2] and " " or ""))
end   

function getHappinessRate(cid)
    if not isCreature(cid) then return 1 end
    local a = getPlayerStorageValue(cid, 1008)
        if a == -1 then return 1 end
    if a >= getConfigValue('PokemonStageVeryHappy') then
        return happinessRate[5].rate
    elseif a >= getConfigValue('PokemonStageHappy') then
        return happinessRate[4].rate
    elseif a >= getConfigValue('PokemonStageOK') then
        return happinessRate[3].rate
    elseif a >= getConfigValue('PokemonStageSad') then
        return happinessRate[2].rate
    else
        return happinessRate[1].rate
    end
return 1
end

function doBodyPush(cid, target, go, pos)
    if not isCreature(cid) or not isCreature(target) then
        doRegainSpeed(cid)
        doRegainSpeed(target)
    return true
    end
        if go then
            local a = getThingPos(cid)
            doChangeSpeed(cid, -getCreatureSpeed(cid))
                if not isPlayer(target) then
                    doChangeSpeed(target, -getCreatureSpeed(target))
                end
            doChangeSpeed(cid, 800)
            doTeleportThing(cid, getThingPos(target))
            doChangeSpeed(cid, -800)
            addEvent(doBodyPush, 350, cid, target, false, a)
        else
            doChangeSpeed(cid, 800)
            doTeleportThing(cid, pos)
            doRegainSpeed(cid)
            doRegainSpeed(target)
        end
end

function doReturnPokemon(cid, pokemon, pokeball, effect, hideeffects, blockevo)

    --////////////////////////////////////////////////////////////////////////////////////////--
    checkDuel(cid)                                                                      --alterado v1.6 duel system
    --////////////////////////////////////////////////////////////////////////////////////////--
    if getPlayerStorageValue(cid, 52480) >= 1 and getPlayerStorageValue(cid, 52484) ~= 10 then
       return sendMsgToPlayer(cid, 27, "You can't do that while the duel don't begins!")        --alterado v1.8
    end
    --////////////////////////////////////////////////////////////////////////////////////////--
    
    if #getCreatureSummons(cid) > 1 and getPlayerStorageValue(cid, 212124) <= 0 then     --alterado v1.6
       if getPlayerStorageValue(cid, 637501) == -2 or getPlayerStorageValue(cid, 637501) >= 1 then  
          BackTeam(cid)       
       end
    end
    -----------------
    local edit = true

    if not pokeball then
        pokeball = getPlayerSlotItem(cid, ?
    end

    if blockevo then
        edit = false
        doPlayerSendCancel(cid, "Your pokemon couldn't evolve due to server mistakes, please wait until we fix the problem.")
    end

    local happy = getPlayerStorageValue(pokemon, 1008)
    local hunger = getPlayerStorageValue(pokemon, 1009)
    local pokelife = (getCreatureHealth(pokemon) / getCreatureMaxHealth(pokemon))

    if edit then
        doItemSetAttribute(pokeball.uid, "happy", happy)
        doItemSetAttribute(pokeball.uid, "hunger", hunger)
        doItemSetAttribute(pokeball.uid, "hp", pokelife)
    end

--    if getCreatureName(pokemon) == "Ditto" then
--        if isTransformed(pokemon) then
    --        local left = getItemAttribute(pokeball.uid, "transLeft") - (os.clock() - getItemAttribute(pokeball.uid, "transBegin"))
    --        doItemSetAttribute(pokeball.uid, "transLeft", left)
    --    end
--    end

    if hideeffects then
        doRemoveCreature(pokemon)
    return true
    end

    local pokename = getPokeName(pokemon)

    local mbk = gobackmsgs[math.random(1, #gobackmsgs)].back:gsub("doka", pokename)

    if getCreatureCondition(cid, CONDITION_INFIGHT) then
        if isCreature(getCreatureTarget(cid)) then
            doItemSetAttribute(pokeball.uid, "happy", happy - 5)
        else
            doItemSetAttribute(pokeball.uid, "happy", happy - 2)
        end
    end

    doTransformItem(pokeball.uid, pokeball.itemid-1)
    doCreatureSay(cid, mbk, 19)

    doSendMagicEffect(getCreaturePosition(pokemon), effect)

    doRemoveCreature(pokemon)

    unLock(pokeball.uid) --alterado v1.8
    
    if useOTClient then
       doPlayerSendCancel(cid, '12//,hide')  --alterado v1.7
    end
    
    if useKpdoDlls then
        doUpdateMoves(cid)
    end

end

local EFFECTS = {
    --[OutfitID] = {Effect}
    ["Magmar"] = 35,                --alterado v1.5
    ["Shiny Magmar"] = 35,
    ["Magby"] = 35,
    ["Jynx"] = 17,   
    ["Smoochum"] = 17, 
    ["Shiny Jynx"] = 17,    
    ["Piloswine"] = 205,  --alterado v1.8
    ["Swinub"] = 205, 
    ["Stantler"] = 205, 
    ["Shiny Stantler"] = 205, 
}

function doGoPokemon(cid, item)

    if getPlayerStorageValue(cid, 17000) >= 1 or getPlayerStorageValue(cid, 17001) >= 1 or getPlayerStorageValue(cid, 63215) >= 1 then
    return true
    end
---------------------------------------------------------------
local ballName = getItemAttribute(item.uid, "poke")

   btype = getPokeballType(item.itemid)                   

    local effect = pokeballs[btype].effect
        if not effect then
            effect = 21
        end
-----------------------------------------------------------------
    if item.uid ~= getPlayerSlotItem(cid, CONST_SLOT_FEET).uid then
        doPlayerSendCancel(cid, "You must put your pokeball in the correct place!")
    return TRUE
    end

    local thishp = getItemAttribute(item.uid, "hp")

    if thishp <= 0 then
        if isInArray(pokeballs[btype].all, item.itemid) then
            doTransformItem(item.uid, pokeballs[btype].off)
            doItemSetAttribute(item.uid, "hp", 0)
            doPlayerSendCancel(cid, "This pokemon is fainted.")
            return true
        end
    end

    local pokemon = getItemAttribute(item.uid, "poke")

    if not pokes[pokemon] then
    return true
    end

----------------------- Sistema de nao poder carregar mais que 3 pokes lvl baixo e + q 1 poke de lvl medio/alto ---------------------------------
if not isInArray({5, 6}, getPlayerGroupId(cid)) then
   local balls = getPokeballsInContainer(getPlayerSlotItem(cid, 3).uid)      --alterado v1.9 \/
   local low = {}
   local lowPokes = {"Rattata", "Caterpie", "Weedle", "Oddish", "Pidgey", "Paras", "Poliwag", "Bellsprout", "Magikarp", "Hoppip", "Sunkern"}
   if #balls >= 1 then
      for _, uid in ipairs(balls) do
          local nome = getItemAttribute(uid, "poke")
          if not isInArray(lowPokes, pokemon) and nome == pokemon then
             return doPlayerSendTextMessage(cid, 27, "Sorry, but you can't carry two pokemons equals!")
          else
             if nome == pokemon then
                table.insert(low, nome)
             end
          end
      end
   end
if #low >= 3 then
   return doPlayerSendTextMessage(cid, 27, "Sorry, but you can't carry more than three pokemons equals of low level!")
end   
end
---------------------------------------------------------------------------------------------------------------------------------------------------

    local x = pokes[pokemon]
    local boosts = getItemAttribute(item.uid, "boost") or 0

    if getPlayerLevel(cid) < (x.level + boosts) then   --alterado v1.8 \/
    doPlayerSendCancel(cid, "You need level "..(x.level + boosts).." to use this pokemon.")
    return true
    end
    
    --------------------------------------------------------------------------------------
    shinysClan = {
    ["Shiny Fearow"] = {4, "Wingeon"},
    ["Shiny Flareon"] = {1, "Volcanic"},
    ["Shiny Vaporeon"] = {2, "Seavel"}, 
    ["Shiny Jolteon"] = {9, "Raibolt"},
    ["Shiny Hypno"] = {7, "Psycraft"},
    ["Shiny Golem"] = {3, "Orebound"},         
    ["Shiny Vileplume"] = {8, "Naturia"},
    ["Shiny Nidoking"] = {5, "Malefic"},
    ["Shiny Hitmontop"] = {6, "Gardestrike"},   
    ["Shiny Metagross"] = {9, "Ironhead"},
    }
    
    if shinysClan[pokemon] and (getPlayerGroupId(cid) < 4 or getPlayerGroupId(cid) > 6) then --alterado v1.9
       if getPlayerStorageValue(cid, 86228) ~= shinysClan[pokemon][1] then
          doPlayerSendCancel(cid, "You need be a member of the clan "..shinysClan[pokemon][2].." to use this pokemon!")
          return true   
       elseif getPlayerStorageValue(cid, 862281) ~= 5 then
          doPlayerSendCancel(cid, "You need be atleast rank 5 to use this pokemon!")
          return true
       end
    end
    --------------------------------------------------------------------------------------

    doSummonMonster(cid, pokemon)

    local pk = getCreatureSummons(cid)[1]
    if not isCreature(pk) then return true end
    
    ------------------------passiva hitmonchan------------------------------
    if isSummon(pk) then                                                  --alterado v1.8 \/
       if pokemon == "Shiny Hitmonchan" or pokemon == "Hitmonchan" then
          if not getItemAttribute(item.uid, "hands") then
             doSetItemAttribute(item.uid, "hands", 0)
          end
          local hands = getItemAttribute(item.uid, "hands")
          doSetCreatureOutfit(pk, {lookType = hitmonchans[pokemon][hands].out}, -1)
       end
    end
    -------------------------------------------------------------------------
    ---------movement magmar, jynx-------------
    if EFFECTS[getCreatureName(pk)] then     
       markPosEff(pk, getThingPos(pk))
       sendMovementEffect(pk, EFFECTS[getCreatureName(pk)], getThingPos(pk))   
    end
    --------------------------------------------------------------------------  

    if getCreatureName(pk) == "Ditto" then

        local left = getItemAttribute(item.uid, "transLeft")
        local name = getItemAttribute(item.uid, "transName")

        if left and left > 0 then
            setPlayerStorageValue(pk, 1010, name)
            doSetCreatureOutfit(pk, {lookType = getItemAttribute(item.uid, "transOutfit")}, -1)
            addEvent(deTransform, left * 1000, pk, getItemAttribute(item.uid, "transTurn"))
            doItemSetAttribute(item.uid, "transBegin", os.clock())
        else
            setPlayerStorageValue(pk, 1010, "Ditto")
        end
    end

    if isGhostPokemon(pk) then doTeleportThing(pk, getPosByDir(getThingPos(cid), math.random(0, 7)), false) end

    doCreatureSetLookDir(pk, 2)

    adjustStatus(pk, item.uid, true, true, true)
    doAddPokemonInOwnList(cid, pokemon)

    doTransformItem(item.uid, item.itemid+1)

    local pokename = getPokeName(pk) --alterado v1.7

    local mgo = gobackmsgs[math.random(1, #gobackmsgs)].go:gsub("doka", pokename)
    doCreatureSay(cid, mgo, TALKTYPE_SAY)

    doSendMagicEffect(getCreaturePosition(pk), effect)

    unLock(item.uid) --alterado v1.8

    
local pk = getCreatureSummons(cid)[1]
local pb = getPlayerSlotItem(cid, 8).uid
local look = getItemAttribute(pb,"addon")
if not look then
doSetItemAttribute(pb,"addon",0)

end
if look > 0 then
doSetCreatureOutfit(pk, {lookType = look}, -1)

end    
    if useKpdoDlls then
        doUpdateMoves(cid)
    end
end

function doRegainSpeed(cid)              --alterado v1.9 \/
if not isCreature(cid) then return true end

   local speed = PlayerSpeed
   if isMonster(cid) then
      speed = getSpeed(cid)
   elseif isPlayer(cid) and isInArray({4, 5, 6}, getPlayerGroupId(cid)) then
      speed = 200*getPlayerGroupId(cid) 
   end
   
   doChangeSpeed(cid, -getCreatureSpeed(cid))
   if getCreatureCondition(cid, CONDITION_PARALYZE) == true then
      doRemoveCondition(cid, CONDITION_PARALYZE)
      addEvent(doAddCondition, 10, cid, paralizeArea2)             
   end
    
doChangeSpeed(cid, speed)
return speed
end

function isPosEqualPos(pos1, pos2, checkstackpos)
    if pos1.x ~= pos2.x or pos1.y ~= pos2.y and pos1.z ~= pos2.z then
    return false
    end
    if checkstackpos and pos1.stackpos and pos2.stackpos and pos1.stackpos ~= pos2.stackpos then
    return false
    end
return true
end

function getRandomGenderByName(name)
local rate = newpokedex[name]
    if not rate then return 0 end
    rate = rate.gender
    if rate == 0 then
        gender = 3
    elseif rate == 1000 then
        gender = 4
    elseif rate == -1 then
        gender = 0
    elseif math.random(1, 1000) <= rate then
        gender = 4
    else
        gender = 3
    end
return gender
end

function getRecorderCreature(pos, cid)
    local ret = 0
    if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
       return cid
    end
    local s = {}
    s.x = pos.x
    s.y = pos.y
    s.z = pos.z
        for a = 0, 255 do
            s.stackpos = a
            local b = getTileThingByPos(s).uid
            if b > 1 and isCreature(b) and getCreatureOutfit(b).lookType ~= 814 then
                ret = b
            end
        end
return ret
end

function doCreatureSetOutfit(cid, outfit, time)
    doSetCreatureOutfit(cid, outfit, time)
end

function doMagicalFlower(cid, away)
    if not isCreature(cid) then return true end
    for x = -3, 3 do
        for y = -3, 3 do
        local a = getThingPos(cid)
        a.x = a.x + x
        a.y = a.y + y
            if away then
                doSendDistanceShoot(a, getThingPos(cid), 21)
            else
                doSendDistanceShoot(getThingPos(cid), a, 21)
            end
        end
    end
end        

function isItemPokeball(item)         --alterado v1.9 \/
if not item then return false end
for a, b in pairs (pokeballs) do
    if isInArray(b.all, item) then return true end
    if item >= 12861 and item <= 13781 then
    return true
    end
    if item >= 13797 and item <= 13823 then
    return true
    end
        if item >= 10975 and item <= 10977 then
        return true
    end
    if item >= 13836 and item <= 13850 then
    return true
    end
    if item >= 13851 and item <= 13856 then
    return true
    end
    if item >= 13859 and item <= 13861 then
    return true
    end
    if item >= 13902 and item <= 13904 then
    return true
    end
    if item >= 13919 and item <= 13930 then
    return true
    end
end
return false
end

function isPokeball(item)
if not item then return false end
for a, b in pairs (pokeballs) do
    if isInArray(b.all, item) then return true end
    if item >= 12861 and item <= 13781 then
    return true
    end
    if item >= 13797 and item <= 13823 then
    return true
    end
        if item >= 10975 and item <= 10977 then
        return true
    end
    if item >= 13836 and item <= 13856 then
    return true
    end
end
return false
end
function getPokeballType(id)
    for a, b in pairs (pokeballs) do
        if isInArray(b.all, id) then
            return a
        end
    end
return "none"
end

randomdiagonaldir = {
[NORTHEAST] = {NORTH, EAST},
[SOUTHEAST] = {SOUTH, EAST},
[NORTHWEST] = {NORTH, WEST},
[SOUTHWEST] = {SOUTH, WEST}}

function doFaceOpposite(cid)
local a = getCreatureLookDir(cid)
local d = {
[NORTH] = SOUTH,
[SOUTH] = NORTH,
[EAST] = WEST,
[WEST] = EAST,
[NORTHEAST] = SOUTHWEST,
[NORTHWEST] = SOUTHEAST,
[SOUTHEAST] = NORTHWEST,
[SOUTHWEST] = NORTHEAST}
doCreatureSetLookDir(cid, d[a])
end

function doFaceRandom(cid)
local a = getCreatureLookDir(cid)
local d = {
[NORTH] = {SOUTH, WEST, EAST},
[SOUTH] = {NORTH, WEST, EAST},
[WEST] = {SOUTH, NORTH, EAST},
[EAST] = {SOUTH, WEST, NORTH}}
doChangeSpeed(cid, 1)
doCreatureSetLookDir(cid, d[a][math.random(1, 3)])
doChangeSpeed(cid, -1)
end

function getFaceOpposite(dir)
local d = {
[NORTH] = SOUTH,
[SOUTH] = NORTH,
[EAST] = WEST,
[WEST] = EAST,
[NORTHEAST] = SOUTHWEST,
[NORTHWEST] = SOUTHEAST,
[SOUTHEAST] = NORTHWEST,
[SOUTHWEST] = NORTHEAST}
return d[dir]
end

function getResistance(cid, combat)
    if isPlayer(cid) then return false end
local poketype1 = pokes[getCreatureName(cid)].type
local poketype2 = pokes[getCreatureName(cid)].type2
local multiplier = 1
    if effectiveness[combat].super and isInArray(effectiveness[combat].super, poketype1) then
        multiplier = multiplier * 2
    end
    if poketype2 and effectiveness[combat].super and isInArray(effectiveness[combat].super, poketype2) then
        multiplier = multiplier * 2
    end
    if effectiveness[combat].weak and isInArray(effectiveness[combat].weak, poketype1) then
        multiplier = multiplier * 0.5
    end
    if poketype2 and effectiveness[combat].weak and isInArray(effectiveness[combat].weak, poketype2) then
        multiplier = multiplier * 0.5
    end
    if effectiveness[combat].non and isInArray(effectiveness[combat].non, poketype1) then
        multiplier = multiplier * 0
    end
    if poketype2 and effectiveness[combat].non and isInArray(effectiveness[combat].non, poketype2) then
        multiplier = multiplier * 0
    end

    if multiplier == 0.25 then
        multiplier = 0.5
    elseif multiplier == 4 then
        multiplier = 2
    end

return multiplier
end

function getCreatureDirectionToTarget(cid, target, ranged)
    if not isCreature(cid) then return true end
    if not isCreature(target) then return getCreatureLookDir(cid) end
    local dirs = {
    [NORTHEAST] = {NORTH, EAST},
    [SOUTHEAST] = {SOUTH, EAST},
    [NORTHWEST] = {NORTH, WEST},
    [SOUTHWEST] = {SOUTH, WEST}}
    local x = getDirectionTo(getThingPos(cid), getThingPos(target), false)
        if x <= 3 then return x
        else
            local xdistance = math.abs(getThingPos(cid).x - getThingPos(target).x)
            local ydistance = math.abs(getThingPos(cid).y - getThingPos(target).y)
                if xdistance > ydistance then
                    return dirs[x][2]
                elseif ydistance > xdistance then
                    return dirs[x][1]
                elseif isInArray(dirs[x], getCreatureLookDir(cid)) then
                    return getCreatureLookDir(cid)
                else
                    return dirs[x][math.random(1, 2)]
                end
        end
end

function getSomeoneDescription(cid)
    if isPlayer(cid) then return getPlayerNameDescription(cid) end
return getMonsterInfo(getCreatureName(cid)).description
end
    

function isGhostPokemon(cid)
    if not isCreature(cid) then return false end
    local ghosts = {"Gastly", "Haunter", "Gengar", "Shiny Gengar", "Misdreavus", "Shiny Abra"}
return isInArray(ghosts, getCreatureName(cid))
end

function updateGhostWalk(cid)
    if not isCreature(cid) then return false end
    local pos = getThingPos(cid)
    pos.x = pos.x + 1
    pos.y = pos.y + 1
    local ret = getThingPos(cid)
    doTeleportThing(cid, pos, false)
    doTeleportThing(cid, ret, false)
return true
end

function doRemoveElementFromTable(t, e)
    local ret = {}
    for a = 1, #t do
        if t[a] ~= e then
        table.insert(ret, t[a])
        end
    end
return ret
end

function doFaceCreature(sid, pos)
if not isCreature(sid) then return true end
    if getThingPos(sid).x == pos.x and getThingPos(sid).y == pos.y then return true end
    local ret = 0

    local ld = getCreatureLookDir(sid)
    local dir = getDirectionTo(getThingPos(sid), pos)
    local al = {
    [NORTHEAST] = {NORTH, EAST},
    [NORTHWEST] = {NORTH, WEST},
    [SOUTHEAST] = {SOUTH, EAST},
    [SOUTHWEST] = {SOUTH, WEST}}

    if dir >= 4 and isInArray(al[dir], ld) then return true end

    doChangeSpeed(sid, 1)
        if dir == 4 then
            ret = math.random(2, 3)
        elseif dir == 5 then
            ret = math.random(1, 2)
        elseif dir == 6 then
            local dirs = {0, 3}
            ret = dirs[math.random(1, 2)]
        elseif dir == 7 then
            ret = math.random(0, 1)
        else
            ret = getDirectionTo(getThingPos(sid), pos)
        end
doCreatureSetLookDir(sid, ret)
doChangeSpeed(sid, -1)
return true
end

function doCreatureAddCondition(cid, condition)
if not isCreature(cid) then return true end
doAddCondition(cid, condition)
end

function doCreatureRemoveCondition(cid, condition)
if not isCreature(cid) then return true end
doRemoveCondition(cid, condition)
end

function setCD(item, tipo, tempo)

    if not tempo or not tonumber(tempo) then
        doItemEraseAttribute(item, tipo)
    return true
    end

    doItemSetAttribute(item, tipo, "cd:"..(tempo + os.time()).."")
return tempo + os.time()
end

function getCD(item, tipo, limite)

    if not getItemAttribute(item, tipo) then
    return 0
    end

    local string = getItemAttribute(item, tipo):gsub("cd:", "")
    local number = tonumber(string) - os.time()

    if number <= 0 then
    return 0
    end

    if limite and limite < number then
        return 0
    end

return number
end

function doSendMoveEffect(cid, target, effect)
if not isCreature(cid) or not isCreature(target) then return true end
doSendDistanceShoot(getThingPos(cid), getThingPos(target), effect)
return true
end

function doSetItemActionId(uid, actionid)
doItemSetAttribute(uid, "aid", actionid)
return true
end

function threeNumbers(number)
    if number <= 9 then
    return "00"..number..""
    elseif number <= 99 then
    return "0"..number..""
    end
return ""..number..""
end

function isBr(cid)
if getPlayerStorageValue(cid, 105505) ~= -1 then
return true
end
return false
end

function isBeingUsed(ball)            
if not ball then return false end
for a, b in pairs (pokeballs) do           --alterado v1.9
    if b.use == ball then return true end
end
return false
end

function doRemoveTile(pos)-- Script by mock
pos.stackpos = 0
local sqm = getTileThingByPos(pos)
doRemoveItem(sqm.uid,1)
end

function doCreateTile(id,pos) -- By mock
doAreaCombatHealth(0,0,pos,0,0,0,CONST_ME_NONE)
doCreateItem(id,1,pos)
end

function hasSqm(pos)
local f = getTileThingByPos(pos)
if f.itemid ~= 0 and f.itemid ~= 1 then
return true
end
return false
end

function getPosDirs(p, dir) -- By MatheusMkalo
return dir == 1 and {x=p.x-1, y=p.y, z=p.z} or dir == 2 and {x=p.x-1, y=p.y+1, z=p.z} or dir == 3 and {x=p.x, y=p.y+1, z=p.z} or dir == 4 and {x=p.x+1, y=p.y+1, z=p.z} or dir == 5 and {x=p.x+1, y=p.y, z=p.z} or dir == 6 and {x=p.x+1, y=p.y-1, z=p.z} or dir == 7 and {x=p.x, y=p.y-1, z=p.z} or dir == 8 and {x=p.x-1, y=p.y-1, z=p.z}
end

function canWalkOnPos(pos, creature, pz, water, sqm, proj)
if not pos then return false end
if not pos.x then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid <= 1 and sqm then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 919 then return false end
if isInArray({4820, 4821, 4822, 4823, 4824, 4825}, getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false end
    local n = not proj and 3 or 2                                    --alterado v1.6
    for i = 0, 255 do
        pos.stackpos = i                           
        local tile = getTileThingByPos(pos)        
        if tile.itemid ~= 0 and i ~= 253 and not isCreature(tile.uid) then     --edited
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end   
return true
end

function canWalkOnPos2(pos, creature, pz, water, sqm, proj)     --alterado v1.6
if not pos then return false end
if not pos.x then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid <= 1 and sqm then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 919 then return false end
if isInArray({4820, 4821, 4822, 4823, 4824, 4825}, getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false end
    --[[local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i                           --edited pra retirar um bug.. ;x
        local tile = getTileThingByPos(pos)        
        if tile.itemid ~= 0 and i ~= 253 and not isCreature(tile.uid) then     --edited
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end ]]  
return true
end

function getFreeTile(pos, cid)
    if canWalkOnPos(pos, true, false, true, true, false) then
        return pos
    end
    local positions = {}
    for a = 0, 7 do
        if canWalkOnPos(getPosByDir(pos, a), true, false, true, true, false) then
        table.insert(positions, pos)
        end
    end
    if #positions >= 1 then
        if isCreature(cid) then
            local range = 1000
            local ret = getThingPos(cid)
            for b = 1, #positions do
                if getDistanceBetween(getThingPos(cid), positions) < range then
                    ret = positions
                    range = getDistanceBetween(getThingPos(cid), positions)
                end
            end
            return ret
        else
            return positions[math.random(#positions)]
        end
    end
return getThingPos(cid)
end

function isWalkable(pos, creature, proj, pz, water)-- by Nord
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
    if getTopCreature(pos).uid > 0 and creature then return false end
    if getTileInfo(pos).protection and pz then return false, true end
    local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i
        local tile = getTileThingByPos(pos)
        if tile.itemid ~= 0 and not isCreature(tile.uid) then
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end
    return true
end


function isPlayerSummon(cid, uid)
return getCreatureMaster(uid) == cid  --alterado v1.9
end

function isSummon(sid)
return isCreature(sid) and getCreatureMaster(sid) ~= sid and isPlayer(getCreatureMaster(sid))   --alterado v1.9
end 

function getItemsInContainerById(container, itemid) -- Function By Kydrai
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
   for slot=0, (getContainerSize(container)-1) do
       local item = getContainerItem(container, slot)
       if isContainer(item.uid) then
          local itemsbag = getItemsInContainerById(item.uid, itemid)
          for i=0, #itemsbag do
              table.insert(items, itemsbag)
          end
       else
          if itemid == item.itemid then
             table.insert(items, item.uid)
          end
       end
   end
end
return items
end

function getPokeballsInContainer(container) -- Function By Kydrai
    if not isContainer(container) then return {} end
    local items = {}
    if isContainer(container) and getContainerSize(container) > 0 then
        for slot=0, (getContainerSize(container)-1) do
            local item = getContainerItem(container, slot)
                if isContainer(item.uid) then
                    local itemsbag = getPokeballsInContainer(item.uid)
                    for i=0, #itemsbag do
                        table.insert(items, itemsbag)
                    end
                elseif isPokeball(item.itemid) then
                    table.insert(items, item.uid)
                end
        end
    end
return items
end

function getItensUniquesInContainer(container)    --alterado v1.6
if not isContainer(container) then return {} end
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
   for slot=0, (getContainerSize(container)-1) do
       local item = getContainerItem(container, slot)
       if isContainer(item.uid) then
          local itemsbag = getItensUniquesInContainer(item.uid)
          for i=0, #itemsbag do
              table.insert(items, itemsbag)
          end
       elseif getItemAttribute(item.uid, "unique") then
          table.insert(items, item)
       end
   end
end
return items
end

function hasSpaceInContainer(container)                --alterado v1.6
if not isContainer(container) then return false end
if getContainerSize(container) < getContainerCap(container) then return true end

for slot = 0, (getContainerSize(container)-1) do
    local item = getContainerItem(container, slot)
    if isContainer(item.uid) then
       if hasSpaceInContainer(item.uid) then
          return true
       end
    end
end
return false
end

function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo
local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
   for i,x in pairs(item) do
       if getThing(x).type < 100 then
          local it = getThing(x)
          doTransformItem(it.uid, itemid, it.type+quant)
          if it.type+quant > 100 then
             doPlayerAddItem(cid, itemid, it.type+quant-100)
          end
       else
          piles = piles+1
       end
   end
else
   return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
   doPlayerAddItem(cid, itemid, quant)
end
end

function getPlayerInArea(fromPos, toPos) -- by jhon992
local online = getPlayersOnline()
local players = {}
for i=1, #online do
    if isInArea(getPlayerPosition(online), fromPos, toPos) then
        players[#players+1] = online
    end
end
return players
end
function isPlayerOnline(uid)
    return isInArray(getPlayersOnline(), uid)
end

function doRegenerateWithY(cid, sid)
if isPlayerOnline(cid) then
local ball = getPlayerSlotItem(cid, ? or getPlayerSlotItem(getCreatureMaster(cid), ?
local Tiers = {
[1] = {bonus = Regen1},
[2] = {bonus = Regen2},
[3] = {bonus = Regen3},
[4] = {bonus = Regen4},
[5] = {bonus = Regen5},
[6] = {bonus = Regen6},
[7] = {bonus = Regen7},
}
if isPlayer(cid) and #getCreatureSummons(cid) > 0 then
local Tier = getItemAttribute(ball.uid, "heldy")
if Tier and Tier > 0 and Tier < 8 then
if not getCreatureCondition(cid, CONDITION_INFIGHT) then
if getCreatureHealth(sid) < getCreatureMaxHealth(sid) then
addEvent(function() doCreatureAddHealth(sid,Tiers[Tier].bonus) doSendAnimatedText(getThingPos(sid), "+ "..Tiers[Tier].bonus, 30) end, 0)
end
addEvent(doRegenerateWithY, 1000, cid, sid)  
else
addEvent(doRegenerateWithY, 1000, cid, sid)
end
end   
end
end 
end

function doCureWithY(cid, sid)
if isPlayerOnline(cid) then
local ball = getPlayerSlotItem(cid, ? or getPlayerSlotItem(getCreatureMaster(cid), ?
local Tiers = {
[8] = {chance = Cure1},
[9] = {chance = Cure2},
[10] = {chance = Cure3},
[11] = {chance = Cure4},
[12] = {chance = Cure5},
[13] = {chance = Cure6},
[14] = {chance = Cure7},
}
local Tier = getItemAttribute(ball.uid, "heldy")
if isPlayer(cid) and #getCreatureSummons(cid) > 0  and Tier then
if Tier > 7 and Tier < 15 then
if math.random(1,100) <= Tiers[Tier].chance then
doCureStatus(sid, "all")
doSendMagicEffect(getThingPosWithDebug(sid), 14)
end
addEvent(doCureWithY, 1000, cid, sid)  
end
end
end   
end
function doPlayerAddItemStacking(cid, itemid, quant)


local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
for i,x in pairs(item) do
if getThing(x).type < 100 then
local it = getThing(x)
doTransformItem(it.uid, itemid, it.type+quant)
if it.type+quant > 100 then
doPlayerAddItem(cid, itemid, it.type+quant-100)
end
else
piles = piles+1
end
break
end
else
return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
doPlayerAddItem(cid, itemid, quant)
end
end

function getDirectionToWalk(p1, pos2)
    local dir = NORTH
    local pos1 = getCreaturePosition(p1)
    if(pos1.x > pos2.x) then
        dir = WEST
        if(pos1.y > pos2.y) then
            dir = NORTHWEST
        elseif(pos1.y < pos2.y) then
            dir = SOUTHWEST
        end
    elseif(pos1.x < pos2.x) then
        dir = EAST
        if(pos1.y > pos2.y) then
            dir = NORTHEAST
        elseif(pos1.y < pos2.y) then
            dir = SOUTHEAST
        end
    else
        if(pos1.y > pos2.y) then
            dir = NORTH
        elseif(pos1.y < pos2.y) then
            dir = SOUTH
        end
    end
    return dir
end

 function getNextStepDelay(cid, dir)
            return tonumber(398)
    end      
    
    
    function getRecorderPlayer(pos, cid)
    local ret = 0
    if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
       return cid
    end
    local s = {}
    s.x = pos.x
    s.y = pos.y
    s.z = pos.z
        for a = 0, 255 do
            s.stackpos = a
            local b = getTileThingByPos(s).uid
            if b > 1 and isPlayer(b) and getCreatureOutfit(b).lookType ~= 814 then
                ret = b
            end
        end
return ret
end

function getRecorderCreature(pos, cid)
    local ret = 0
    if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
       return cid
    end
    local s = {}
    s.x = pos.x
    s.y = pos.y
    s.z = pos.z
        for a = 0, 255 do
            s.stackpos = a
            local b = getTileThingByPos(s).uid
            if b > 1 and isCreature(b) and getCreatureOutfit(b).lookType ~= 814 then
                ret = b
            end
        end
return ret
end

function hasTile(pos)    --Verifica se tem TILE na pos
pos.stackpos = 0
if getTileThingByPos(pos).itemid >= 1 then
   return true
end
return false
end
function doPlayerAddItemStacking(cid, itemid, quant)


local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
for i,x in pairs(item) do
if getThing(x).type < 100 then
local it = getThing(x)
doTransformItem(it.uid, itemid, it.type+quant)
if it.type+quant > 100 then
doPlayerAddItem(cid, itemid, it.type+quant-100)
end
else
piles = piles+1
end
break
end
else
return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
doPlayerAddItem(cid, itemid, quant)
end
end

function isFly(cid)
   if getPlayerStorageValue(cid, orderTalks["fly"].storage) == 1 then
      return true 
   end
   return false
end


function doOTCSendPokemonHealth(cid)
    local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET)
    local pokemon = getCreatureSummons(cid)
    if not ball.uid or ball.uid <= 1 then
        return doSendPlayerExtendedOpcode(cid, 122, "0|0")
    end
    if #pokemon >= 1 then
        return doSendPlayerExtendedOpcode(cid, 122, getCreatureHealth(pokemon[1]).."|"..getCreatureMaxHealth(pokemon[1]))
    end
end

---- FUNÇÃO SELF ATTACK CREATURE ----
function selfAttackCreature()
if #getCreatureSummons(getNpcCid()) > 0 and not isCreature(getCreatureTarget(getCreatureSummons(getNpcCid())[1])) then
    local list = getSpectators(getCreaturePosition(getNpcCid()), 7, 7, false)
    for i=0, table.getn(list) do
        local _target = list
        if(_target ~= 0) then
            if isPlayer(_target) and not getTileInfo(getThingPos(_target)).protection then
                if #getCreatureSummfighting = falseons(_target) > 0 then
                    doMonsterSetTarget(getCreatureSummons(getNpcCid())[1], getCreatureSummons(_target)[1])
                    setPlayerStorageValue(getCreatureSummons(getNpcCid())[1], 99856201, getNpcCid())
                else
                  fighting = false
                end
                target = _target
                break
            end
        end
    end
end

end

 

Pronto, já está adicionado! Só lembrando que tirei o local porque essa vai ser uma função global, ou seja, vai poder ser usada em qualquer outro arquivo da pasta Data do servidor.

 

Testa agora e vê se resolve seu problema.

Link para o comentário
Compartilhar em outros sites

  • 0
3 horas atrás, Yan18 disse:

Vou colocar em spoiler porque a página buga quando tem muitos texto grandes:

 

  Ocultar conteúdo

function getStringOfTaskArray(array)
   if type(array) ~= 'table' or not next(array) then return "" end
   
   local result = {}
    for _, value in ipairs(array) do
        local thing, num = (type(value[1]) == 'string' and value[1] or getItemNameById(value[1])), value[2]
        table.insert(result, (_ == 1 and "" or ", ")..num.." "..thing..(num == 1 and "" or "s"))
    end
    result[#result] = " and"..(result[#result]:sub(2,#result[#result]))
    return table.concat(result)
end

function getVitalityByMaster(cid)
if not isCreature(cid) then return 0 end
local ball = getPlayerSlotItem(cid, 8).uid
if not ball or ball <= 1 or not pokes[getItemAttribute(ball, 'poke')] then return true end
   return pokes[getItemAttribute(ball, 'poke')].vitality * (getPlayerLevel(cid) + (getItemAttribute(ball, 'boost') or 0))
end

function onPokeHealthChange(cid, zerar)
   if not isCreature(cid) then return true end
   if zerar then doPlayerSendCancel(cid, '#ph#,0,0') end
   local ball = getPlayerSlotItem(cid, 8).uid
   if not ball or ball <= 1 or not pokes[getItemAttribute(ball, 'poke')] then return true end
   
   if #getCreatureSummons(cid) >= 1 and getPlayerStorageValue(cid, 212124) <= 0 then   --alterado v1.6
      local pokemon = getCreatureSummons(cid)[1]
      local pokelife = (getCreatureHealth(pokemon) / getCreatureMaxHealth(pokemon))
      doItemSetAttribute(ball, "hp", pokelife)
   end
   
      local rd = 1 - (tonumber(getItemAttribute(ball, "hp")))
   local maxHp = HPperVITsummon * getVitalityByMaster(cid) 
   local hp = maxHp -(maxHp * rd)   
   doPlayerSendCancel(cid, '#ph#,'.. math.floor(hp) ..','.. math.floor(maxHp))
end

function addPokeToPlayer(cid, pokemon, boost, gender, ball)             --alterado v1.9 \/ peguem ele todo...
local genders = {
["male"] = 4,
["female"] = 3,
[1] = 4,
[0] = 3,
[4] = 4,
[3] = 3,
}
if not isCreature(cid) then return false end

local pokemon = doCorrectString(pokemon)
if not pokes[pokemon] then return false end

   local GENDER = (gender and genders[gender]) and genders[gender] or getRandomGenderByName(pokemon)
   local btype = (ball and pokeballs[ball]) and ball or isShinyName(pokemon) and "shinynormal" or "normal"
   local happy = 250
   
   if icons[pokemon] then
      id = icons[pokemon].on
   else
      id = pokeballs[btype].on
   end

   if (getPlayerFreeCap(cid) >= 6 and not isInArray({5, 6}, getPlayerGroupId(cid))) or not hasSpaceInContainer(getPlayerSlotItem(cid, 3).uid) then 
      item = doCreateItemEx(id)
   else
      item = addItemInFreeBag(getPlayerSlotItem(cid, 3).uid, id, 1)   
   end
   if not item then return false end

   doItemSetAttribute(item, "poke", pokemon)
   doItemSetAttribute(item, "hp", 1)
   doItemSetAttribute(item, "happy", happy)
   --doItemSetAttribute(item, "-1", GENDER)
   doSetItemAttribute(item, "hands", 0)
   doItemSetAttribute(item, "description", "Contains a "..pokemon..".")
   doItemSetAttribute(item, "fakedesc", "Contains a "..pokemon..".") 
   doItemSetAttribute(item, "defeated", "no")
   doItemSetAttribute(item, "ball", btype)
   doItemSetAttribute(item, "tadport", fotos[pokemon])
   if boost and tonumber(boost) and tonumber(boost) > 0 and tonumber(boost) <= 50 then
      doItemSetAttribute(item, "boost", boost)
   end
   if unique then
      doItemSetAttribute(item, "unique", getCreatureName(cid))
   end
                                                                             
   if (getPlayerFreeCap(cid) >= 6 and not isInArray({5, 6}, getPlayerGroupId(cid))) or not hasSpaceInContainer(getPlayerSlotItem(cid, 3).uid) then
      doPlayerSendMailByName(getCreatureName(cid), item, 1)
      sendMsgToPlayer(cid, 27, "You are already holding six pokemons, so your new pokemon was sent to your depot.")
   end
   doTransformItem(item, id)
return true
end 
---------------------------

function unLock(ball)                                                             
if not ball or ball <= 0 then return false end
if getItemAttribute(ball, "lock") and getItemAttribute(ball, "lock") > 0 then
   local vipTime = getItemAttribute(ball, "lock")
   local timeNow = os.time()
   local days = math.ceil((vipTime - timeNow)/(24 * 60 * 60))
   if days <= 0 then
      doItemEraseAttribute(ball, "lock")    
      doItemEraseAttribute(ball, "unique")
      return true
   end
end
return false
end

function getGuildMembersOnline(GuildId)
local players = {}
for _, pid in pairs(getPlayersOnline()) do
    if getPlayerGuildId(pid) == tonumber(GuildId) then
       table.insert(players, pid)
    end
end                                                   --by Vodkart
return #players > 0 and players or false
end

function getGuildMembers(GuildId)
local players,query = {},db.getResult("SELECT `name` FROM `players` WHERE `rank_id` IN (SELECT `id` FROM `guild_ranks` WHERE `guild_id` = " .. GuildId .. ");")
if (query:getID() ~= -1) then  
   repeat
         table.insert(players,query:getDataString("name"))
   until not query:next()                           --by Vodkart
   query:free()
end
return #players > 0 and players or false
end 
--/////////////////////////////////////////////////////////////////////////////////---
function sendMsgToPlayer(cid, tpw, msg)      --alterado v1.7 \/\/\/
if not isCreature(cid) or not tpw or not msg then return true end
return doPlayerSendTextMessage(cid, tpw, msg)
end

function getPlayerDesc(cid, thing, TV)
if (not isCreature(cid) or not isCreature(thing)) and not TV then return "" end

local pos = getThingPos(thing)
local ocup = youAre[getPlayerGroupId(thing)]
local rank = (getPlayerStorageValue(thing, 86228) <= 0) and "a Pokemon Trainer" or lookClans[getPlayerStorageValue(thing, 86228)][getPlayerStorageValue(thing, 862281)]
local name = thing == cid and "yourself" or getCreatureName(thing)     
local art = thing == cid and "You are" or (getPlayerSex(thing) == 0 and "She is" or "He is")
   
local str = {}
table.insert(str, "You see "..name..". "..art.." ")
if youAre[getPlayerGroupId(thing)] then
   table.insert(str, (ocup).." and "..rank.." from ".. getTownName(getPlayerTown(thing))..".")       
else
   table.insert(str, (rank).." from ".. getTownName(getPlayerTown(thing))..".")
end
if getPlayerGuildId(thing) > 0 then
   table.insert(str, " "..art.." "..getPlayerGuildRank(thing).." from the "..getPlayerGuildName(thing)..".")
end
if TV then
   table.insert(str, " "..art.." watching TV.")
end
table.insert(str, ((isPlayer(cid) and youAre[getPlayerGroupId(cid)]) and "\nPosition: [X: "..pos.x.."][Y: "..pos.y.."][Z: "..pos.z.."]" or "")) 

return table.concat(str) 
end

function doRevivePokemon(cid, pokemon)
  if getPlayerItemCount(cid, 12344) <= 0 then return doPlayerSendCancel(cid, "Voce nao tem nenhum revive.") end
  local cooldownMoves = {
    ["Selfdestruct"] = 30,
    ["Selfdestruction"] = 30,
  }
  local balls = getPokeballsInContainerNew(getPlayerSlotItem(cid, 3).uid)
  if isPokeball(getPlayerSlotItem(cid, CONST_SLOT_FEET).itemid) then
    table.insert(balls, getPlayerSlotItem(cid, CONST_SLOT_FEET))
  end
  for i =1, #balls do
    local ball = balls
    -- print("Pokemon: "..pokemon.." attrpoke> "..(getItemAttribute(ball.uid, "poke") or "sempoke").." attrnick> "..(getItemAttribute(ball.uid, "nick") or "sem nick"))
    if getItemAttribute(ball.uid, "poke") == pokemon or getItemAttribute(ball.uid, "nick") == pokemon then
      -- print("IGUAL")
      for type, index in pairs(pokeballs) do
        -- print(index.on.." / "..index.off)
        if ball.itemid == index.on or ball.itemid == index.off then
          -- print("revive")
          doTransformItem(ball.uid, index.on)
          doSetItemAttribute(ball.uid, "hp", 1)
          local name = getItemAttribute(ball.uid, "poke")
          for c = 1, 15 do
            local str = "move"..c
            local move = movestable[name][str]; move = move and cooldownMoves[move.name]
            setCD(ball.uid, str, move or 0)
          end
          setCD(ball.uid, "control", 0)
          setCD(ball.uid, "blink", 0) --alterado v1.6
          doSendMagicEffect(getThingPos(cid), 13)
          doPlayerRemoveItem(cid, 12344, 1)
          doCureBallStatus(ball.uid, "all")
          doUpdatePokemonsBar(cid)
          cleanBuffs2(ball.uid) --alterado v1.5
          return
        end
      end
    end
  end
end

function getPokeballsInContainerNew(container)
  if not isContainer(container) then return {} end
  local items = {}
  if isContainer(container) and getContainerSize(container) > 0 then
      for slot=0, (getContainerSize(container)-1) do
      local item = getContainerItem(container, slot)
      if isContainer(item.uid) then
          local itemsbag = getPokeballsInContainerNew(item.uid)
          for i=0, #itemsbag do
          table.insert(items, itemsbag)
          end
      elseif isPokeball(item.itemid) then
          table.insert(items, item)
      end
      end
  end
  return items
end

-------------------------------------------------------------------------------------------------   /\/\
function getLivePokeballs(cid, container, duel) 
    if not isCreature(cid) then return {} end     
    if not isContainer(container) then return {} end
    local items = {}
    ---
    local ballSlot = getPlayerSlotItem(cid, ?
    if ballSlot.uid ~= 0 then
       for a, b in pairs (pokeballs) do
           if ballSlot.itemid == b.on or ballSlot.itemid == b.use then
              if duel and getPlayerLevel(cid) >= (pokes[getItemAttribute(ballSlot.uid, "poke")].level + getPokeballBoost(ballSlot)) then
                 table.insert(items, ballSlot.uid)                                                                      --alterado v1.8
              elseif not duel then
                 table.insert(items, ballSlot.uid)
              end
           end
       end
    end
    ---     
    if isContainer(container) and getContainerSize(container) > 0 then      
        for slot=0, (getContainerSize(container)-1) do
            local item = getContainerItem(container, slot)
                if isContainer(item.uid) then
                    local itemsbag = getPokeballsInContainer(item.uid)
                    for i=0, #itemsbag do
                        if not isInArray(items, itemsbag) then
                           table.insert(items, itemsbag)
                        end
                    end
                elseif isPokeball(item.itemid) then
                    for a, b in pairs (pokeballs) do
                        if item.itemid == b.on then
                           if duel and getPlayerLevel(cid) >= (pokes[getItemAttribute(item.uid, "poke")].level + getPokeballBoost(item)) then    
                              table.insert(items, item.uid)                                            --alterado v1.8
                           elseif not duel then
                              table.insert(items, item.uid)
                           end
                        end
                    end
                end
        end
    end
return items
end

function addItemInFreeBag(container, item, num)
if not isContainer(container) or not item then return false end                                             
if not num or num <= 0 then num = 1 end                                            --alterado v1.6.1
if getContainerSize(container) < getContainerCap(container) then
   return doAddContainerItem(container, item, num)
else
   for slot = 0, (getContainerSize(container)-1) do
       local container2 = getContainerItem(container, slot)
       if isContainer(container2.uid) and getContainerSize(container2.uid) < getContainerCap(container2.uid) then
          return doAddContainerItem(container2.uid, item, num)
       end
   end
end
return false
end
------------------------------------------------------------------------------------------------------
function pokeHaveReflect(cid)
if not isCreature(cid) then return false end
local table = getTableMove(cid, "Reflect")
if table and table.name then     --alterado v1.6
   return true 
end
return false
end
------------------------------------------------------------------------------------------------------
function nextHorario(cid)
    horarioAtual = os.date("%X")
    horario = string.explode(horarioAtual, ":")
    
    for i = 1, #horas do
        horarioComparacao = horas
        horarioComp = string.explode(horarioComparacao, ":")
        ---------------
        if tonumber(horarioComp[1]) > tonumber(horario[1]) then
           return horarioComparacao                                
        elseif tonumber(horarioComp[1]) == tonumber(horario[1]) and tonumber(horario[2]) < tonumber(horarioComp[2]) then
           return horarioComparacao
        end
    end 
    return horas[1]                                  
end                                                               

function getTimeDiff(timeDiff)
local dateFormat = {
{'hour', timeDiff / 60 / 60}, --6%
{'min', timeDiff / 60 % 60},
}
local out = {}                                   
for k, t in ipairs(dateFormat) do
    local v = math.floor(t[2])
    if(v > -1) then
         table.insert(out, (k < #dateFormat and '' or ' and ') .. v .. '' .. (v <= 1 and t[1] or t[1].."s"))
    end
end
if tonumber(dateFormat[1][2]) == 0 and tonumber(dateFormat[2][2]) == 0 then
   return "seconds"
end
return table.concat(out)
end

function getTimeDiff2(timeDiff)
local dateFormat = {
{'hour', timeDiff / 60 / 60}, --6%
{'min', timeDiff / 60 % 60},
{'sec', timeDiff % 60},
}
local out = {}                                  
for k, t in ipairs(dateFormat) do
    local v = math.floor(t[2])
    if(v > 0) then
         table.insert(out, (k < #dateFormat and ' ' or ' and ') .. v .. '' .. (v <= 1 and t[1] or t[1].."s"))
    end
end
return table.concat(out)
end 

function showTimeDiff(timeComp)
local b = string.explode(os.date("%X"), ":")
local c = string.explode(timeComp, ":")
    ---
    local d, m, y = os.date("%d"), os.date("%m"), os.date("%Y")
    local hAtual, mAtual = tonumber(b[1]), tonumber(b[2])
    local hComp, mComp = tonumber(c[1]), tonumber(c[2])
    ---
    local t = os.time{year= y, month= m, day= d, hour= hAtual, min= mAtual}
    local t1 = os.time{year= y, month= m, day= d, hour= hComp, min= mComp}
    ---                                                                       
    comparacao = t1-t
    if hComp < hAtual then
       v = os.time{year= y, month= m, day= d, hour= 24, min= 0}
       v2 = os.time{year= y, month= m, day= d, hour= 0, min= 0}
       comparacao = (v-t)+(t1-v2)
    end
return getTimeDiff(comparacao)
end
-------------------------------------------------------------------------
function cleanCMcds(item)
if item ~= 0 then
   for c = 1, 15 do              --alterado v1.5
      local str = "cm_move"..c
      setCD(item, str, 0)
   end
end
end

function ehNPC(cid)   --alterado v1.9
return isCreature(cid) and not isPlayer(cid) and not isSummon(cid) and not isMonster(cid)
end

function ehMonstro(cid)
local eh = false
    if not isSummon(cid) and not ehNPC(cid) and not isPlayer(cid) then
        eh = true
    end
    return eh
end                                                      --alterado v1.9.1 /\

function doAppear(cid) --Faz um poke q tava invisivel voltar a ser visivel...
if not isCreature(cid) then return true end
doRemoveCondition(cid, CONDITION_INVISIBLE)
doRemoveCondition(cid, CONDITION_OUTFIT)
doCreatureSetHideHealth(cid, false)
end

function doDisapear(cid)   --Faz um pokemon ficar invisivel
if not isCreature(cid) then return true end
doCreatureAddCondition(cid, permanentinvisible)
doCreatureSetHideHealth(cid, true)
doSetCreatureOutfit(cid, {lookType = 2}, -1)
end

function getThingFromPosWithProtect(pos)  --Pega uma creatura numa posiçao com proteçoes
if hasTile(pos) then
   if isCreature(getRecorderCreature(pos)) then
      return getRecorderCreature(pos)
   else
      pos.stackpos = 253
      pid = getThingfromPos(pos).uid
   end
else
   pid = getThingfromPos({x=1,y=1,z=10,stackpos=253}).uid
end
return pid
end

function getTileThingWithProtect(pos)    --Pega um TILE com proteçoes
if hasTile(pos) then
pos.stackpos = 0
   pid = getTileThingByPos(pos)
else
   pid = getTileThingByPos({x=1,y=1,z=10,stackpos=0})
end
return pid
end

function canAttackOther(cid, pid)         --Function q verifica se um poke/player pode atacar outro poke/player

if not isCreature(cid) or not isCreature(pid) then return "Cant" end

local master1 = isSummon(cid) and getCreatureMaster(cid) or cid
local master2 = isSummon(pid) and getCreatureMaster(pid) or pid
   
   ----             
   if getPlayerStorageValue(master1, 6598754) >= 5 and getPlayerStorageValue(master2, 6598754) >= 5 then
      if getPlayerStorageValue(master1, 6598754) ~= getPlayerStorageValue(master2, 6598754) then
         if isDuelingAgainst(master1, master2) then   --alterado v1.8
            if isSummon(cid) and isPlayer(pid) then
               return "Cant"
            else
               return "Can"
            end
         end
      end
   end
   ----              pvp system
   if getPlayerStorageValue(master1, 6598754) >= 1 and getPlayerStorageValue(master2, 6598755) >= 1 then
      return "Can" 
   end
   if getPlayerStorageValue(master1, 6598755) >= 1 and getPlayerStorageValue(master2, 6598754) >= 1 then  ---estar em times diferentes
      return "Can"
   end
   ----
if getTileInfo(getThingPos(cid)).pvp then

return "Can"

end

   if ehMonstro(cid) or ehMonstro(pid) then
      return "Can"
   end

return "Cant"
end
   
      
function stopNow(cid, time)   
if not isCreature(cid) or not tonumber(time) or isSleeping(cid) then return true end
                                                        --alterado v1.9.1 \/
local function podeMover(cid)                         
if isPlayer(cid) then 
   mayNotMove(cid, false) 
elseif isCreature(cid) then 
   doRegainSpeed(cid) 
end
end

if isPlayer(cid) then mayNotMove(cid, true) else doChangeSpeed(cid, -getCreatureSpeed(cid)) end
addEvent(podeMover, time, cid)
end

function doReduceStatus(cid, off, def, agi)   --reduz os status
if not isCreature(cid) then return true end
local A = getOffense(cid)
local B = getDefense(cid)
local C = getSpeed(cid)

if off > 0 then
   setPlayerStorageValue(cid, 1001, A - off)
end
if def > 0 then
   setPlayerStorageValue(cid, 1002, B - def)
end
if agi > 0 then
   setPlayerStorageValue(cid, 1003, C - agi)
   if getCreatureSpeed(cid) ~= 0 then
      doRegainSpeed(cid)
   end                                              --alterado v1.5  functions arrumadas...
end
end

function doRaiseStatus(cid, off, def, agi, time)  
if not isCreature(cid) then return true end
local A = getOffense(cid)
local B = getDefense(cid)
local C = getSpeed(cid)

if off > 0 then
   setPlayerStorageValue(cid, 1001, A * off)
end
if def > 0 then
   setPlayerStorageValue(cid, 1002, B * def)
end
if agi > 0 then
   setPlayerStorageValue(cid, 1003, C + agi)
   if getCreatureSpeed(cid) ~= 0 then
      doRegainSpeed(cid)
   end
end

local D = getOffense(cid)
local E = getDefense(cid)
local F = getSpeed(cid)
---------------------------
local G = D - A
local H = E - B
local I = F - C

addEvent(doReduceStatus, time*500, cid, G, H, I)
end


function BackTeam(cid)          
  if isCreature(cid) then
     local summon = getCreatureSummons(cid)   --alterado v1.6
     for i = 2, #summon do
         doSendMagicEffect(getThingPos(summon), 211)
         doRemoveCreature(summon)
     end
     setPlayerStorageValue(cid, 637501, -1)
  end  
end
    
function choose(...) -- by mock
    local arg = {...}
    return arg[math.random(1,#arg)]
end

function AddPremium(cid, days)
local function removerPlayer(cid)
if isCreature(cid) then
   doRemoveCreature(cid)
end
end

db.executeQuery("UPDATE `accounts` SET `premdays` = '"..days.."' WHERE `accounts`.`id` = ".. getPlayerAccountId(cid) ..";")
doPlayerSendTextMessage(cid,25,"Você será kickado em 5 segundos.")    
addEvent(removerPlayer, 5*1000, cid)     
return TRUE
end

function isShiny(cid) 
return isCreature(cid) and string.find(getCreatureName(cid), "Shiny")  --alterado v1.9
end

function isShinyName(name)        
return tostring(name) and string.find(doCorrectString(name), "Shiny") --alterado v1.9
end

function doConvertTypeToStone(type, string)
local t = {
["fly"] = {heart, "heart"},
["flying"] = {heart, "heart"},
["normal"] = {heart, "heart"},
["fire"] = {fire, "fire"},
["grass"] = {leaf, "leaf"},
["leaf"] = {leaf, "leaf"},
["water"] = {water, "water"},
["poison"] = {venom, "venom"},
["venom"] = {venom, "venom"},
["electric"] = {thunder, "thunder"},
["thunder"] = {thunder, "thunder"},
["rock"] = {rock, "rock"},
["fight"] = {punch, "punch"},
["fighting"] = {punch, "punch"},
["bug"] = {coccon, "coccon"},
["dragon"] = {crystal, "crystal"},
["dark"] = {dark, "dark"},
["ghost"] = {dark, "dark"},
["ground"] = {earth, "earth"},
["earth"] = {earth, "earth"},
["psychic"] = {enigma, "enigma"},
["steel"] = {metal, "metal"},
["ancient"] = {ancient, "ancient"},
["metal"] = {metal, "metal"},
["ice"] = {ice, "ice"},
["boost"] = {boostStone, "boost"},  --alterado v1.9
}

if string then
return t[type][2]
else
return t[type][1]
end
end

function doConvertStoneIdToString(stoneID)
local t = {
[11453] = "Heart Stone",
[11441] = "Leaf Stone",
[11442] = "Water Stone",
[11443] = "Venom Stone",
[11444] = "Thunder Stone",
[11445] = "Rock Stone",
[11446] = "Punch Stone", 
[11447] = "Fire Stone",               --alterado v1.6
[11448] = "Cocoon Stone", 
[11449] = "Crystal Stone",
[11450] = "Darkess Stone", 
[11451] = "Earth Stone",
[11452] = "Enigma Stone",
[11454] = "Ice Stone", 
[12244] = "Ancient Stone",
[12232] = "Metal Stone",
[12401] = "Shiny Fire Stone",
[12402] = "Shiny Water Stone",
[12403] = "Shiny Leaf Stone",
[12404] = "Shiny Heart Stone",
[12405] = "Shiny Enigma Stone",
[12406] = "Shiny Rock Stone",
[12407] = "Shiny Venom Stone", 
[12408] = "Shiny Ice Stone",
[12409] = "Shiny Thunder Stone",
[12410] = "Shiny Crystal Stone",
[12411] = "Shiny Cocoon Stone",
[12412] = "Shiny Darkness Stone",
[12413] = "Shiny Punch Stone",
[12414] = "Shiny Earth Stone",
[boostStone] = "Boost Stone",  --alterado v1.9
[20897] = "Virus",
[20898] = "Glice Stone",
[20899] = "Green Stone",
[20900] = "Mag Stone",
[20901] = "Electri Stone",
[20902] = "Perior Stone",
[20903] = "Kiss Stone",
[20904] = "Shiny Stone",
[20905] = "Zone Stone",
[21996] = "Llade Stone",
[21997] = "Scor Stone",
[21998] = "Licky Stone",
[21999] = "Poryz Stone",
[22000] = "Probo Stone",
[22001] = "Wea Stone",
[22002] = "Yanm Stone",
[22003] = "Fros Stone",
[22004] = "Special Stone",
[22067] = "Super Darkness Stone",
[22068] = "Super Ice Stone",
[22071] = "Super Fire Stone",
[22072] = "Super Water Stone",
}
if t[stoneID] then
return t[stoneID]
else
return ""
end
end

function isStone(id)
if id >= leaf and id <= ice then
return true
end
if id == boostStone then  --alterado v1.9
return true
end
if id == 12232 or id == 12244 or id == 12244 or id == 12245 then
return true                                 
end
if id == 20904 then
return true                                 
end
if (id >= sfire and id <= searth) or id == 12417 or id == 12419 then
return true 
end
return false
end

function isWater(id)
return tonumber(id) and id >= 4820 and id <= 4825 --alterado v1.9
end

function getTopCorpse(position)
local pos = position
for n = 1, 255 do
    pos.stackpos = n
    local item = getTileThingByPos(pos)
    if item.itemid >= 2 and (string.find(getItemNameById(item.itemid), "fainted ") or string.find(getItemNameById(item.itemid), "defeated ")) then
       return getTileThingByPos(pos)
    end
end
return null
end

bpslot = CONST_SLOT_BACKPACK

function hasPokemon(cid)
    if not isCreature(cid) then return false end
    if getCreatureMana(cid) <= 0 then return false end
    if #getCreatureSummons(cid) >= 1 then return true end
    local item = getPlayerSlotItem(cid, CONST_SLOT_FEET)
    local bp = getPlayerSlotItem(cid, bpslot)
    for a, b in pairs (pokeballs) do
        if item.itemid == b.on or item.itemid == b.use then
        return true                              --alterado v1.4
        end
        if #getItemsInContainerById(bp.uid, b.on) >= 1 then
        return true
        end
    end
return false
end

function isNpcSummon(cid)
return isNpc(getCreatureMaster(cid))
end

--function getPokemonHappinessDescription(cid)
--    if not isCreature(cid) then return true end
--    local str = {}
    --if getPokemonGender(cid) == SEX_MALE then
    --    table.insert(str, "He")
    --elseif getPokemonGender(cid) == SEX_FEMALE then
    --    table.insert(str, "She")
    --else
    --    table.insert(str, "It")
    --end
    --local h = getPlayerStorageValue(cid, 1008)
--    if h >= tonumber(getConfigValue('PokemonStageVeryHappy')) then
--        table.insert(str, " is very happy with you!")
--    elseif h >= tonumber(getConfigValue('PokemonStageHappy')) then
--        table.insert(str, " is happy.")
--    elseif h >= tonumber(getConfigValue('PokemonStageOK')) then
--        table.insert(str, " is unhappy.")
--    elseif h >= tonumber(getConfigValue('PokemonStageSad')) then
--        table.insert(str, " is sad.")
--    elseif h >= tonumber(getConfigValue('PokemonStageMad')) then
--        table.insert(str, " is mad.")
--    else
--        table.insert(str, " is very mad at you!")
--    end
--return table.concat(str)
--end

function doSetItemAttribute(item, key, value)
doItemSetAttribute(item, key, value)
end

function deTransform(cid, check)
    if not isCreature(cid) then return true end

    local m = getCreatureMaster(cid)
    local p = getPlayerSlotItem(m, ?

    if getItemAttribute(p.uid, "transTurn") ~= check then return true end

    setPlayerStorageValue(cid, 1010, getCreatureName(cid) == "Ditto" and "Ditto" or "Shiny Ditto")        --edited
    doRemoveCondition(cid, CONDITION_OUTFIT)
    doSendMagicEffect(getThingPos(cid), 184)
    doCreatureSay(cid, "DITTO!", TALKTYPE_MONSTER)
    doItemSetAttribute(p.uid, "transBegin", 0)
    doItemSetAttribute(p.uid, "transLeft", 0)
    doItemEraseAttribute(p.uid, "transName")
    adjustStatus(cid, p.uid, true, true, true)
end

function isTransformed(cid)
return isCreature(cid) and not isInArray({-1, "Ditto", "Shiny Ditto"}, getPlayerStorageValue(cid, 1010))  --alterado v1.9
end

function doSendFlareEffect(pos)
    local random = {28, 29, 79}
    doSendMagicEffect(pos, random[math.random(1, 3)])
end

function isDay()
    local a = getWorldTime()
    if a >= 360 and a < 1080 then
    return true
    end
return false
end

function doPlayerSendTextWindow(cid, p1, p2)
    if not isCreature(cid) then return true end
    local item = 460
    local text = ""
    if type(p1) == "string" then
        doShowTextDialog(cid, item, p1)
    else
        doShowTextDialog(cid, p1, p2)
    end
end

function getClockString(tw)
    local a = getWorldTime()
    local b = a / 60
    local hours = math.floor(b)
    local minut = a - (60 * hours)

    if not tw then
        if hours < 10 then
            hours = "0"..hours..""
        end
        if minut < 10 then
            minut = "0"..minut..""
        end
    return hours..":"..minut
    else
        local sm = "a.m"
        if hours >= 12 then
            hours = hours - 12
            sm = "p.m"
        end
        if hours < 10 then
            hours = "0"..hours..""
        end
        if minut < 10 then
            minut = "0"..minut..""
        end
    return hours..":"..minut.." "..sm
    end
end

function doCorrectPokemonName(poke)
return doCorrectString(poke)
end

function doCorrectString(str)
local name = str:explode(" ")  --alterado v1.9
local final = {}
for _, s in ipairs(name) do
    table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower())
end
return table.concat(final, (name[2] and " " or ""))
end   

function getHappinessRate(cid)
    if not isCreature(cid) then return 1 end
    local a = getPlayerStorageValue(cid, 1008)
        if a == -1 then return 1 end
    if a >= getConfigValue('PokemonStageVeryHappy') then
        return happinessRate[5].rate
    elseif a >= getConfigValue('PokemonStageHappy') then
        return happinessRate[4].rate
    elseif a >= getConfigValue('PokemonStageOK') then
        return happinessRate[3].rate
    elseif a >= getConfigValue('PokemonStageSad') then
        return happinessRate[2].rate
    else
        return happinessRate[1].rate
    end
return 1
end

function doBodyPush(cid, target, go, pos)
    if not isCreature(cid) or not isCreature(target) then
        doRegainSpeed(cid)
        doRegainSpeed(target)
    return true
    end
        if go then
            local a = getThingPos(cid)
            doChangeSpeed(cid, -getCreatureSpeed(cid))
                if not isPlayer(target) then
                    doChangeSpeed(target, -getCreatureSpeed(target))
                end
            doChangeSpeed(cid, 800)
            doTeleportThing(cid, getThingPos(target))
            doChangeSpeed(cid, -800)
            addEvent(doBodyPush, 350, cid, target, false, a)
        else
            doChangeSpeed(cid, 800)
            doTeleportThing(cid, pos)
            doRegainSpeed(cid)
            doRegainSpeed(target)
        end
end

function doReturnPokemon(cid, pokemon, pokeball, effect, hideeffects, blockevo)

    --////////////////////////////////////////////////////////////////////////////////////////--
    checkDuel(cid)                                                                      --alterado v1.6 duel system
    --////////////////////////////////////////////////////////////////////////////////////////--
    if getPlayerStorageValue(cid, 52480) >= 1 and getPlayerStorageValue(cid, 52484) ~= 10 then
       return sendMsgToPlayer(cid, 27, "You can't do that while the duel don't begins!")        --alterado v1.8
    end
    --////////////////////////////////////////////////////////////////////////////////////////--
    
    if #getCreatureSummons(cid) > 1 and getPlayerStorageValue(cid, 212124) <= 0 then     --alterado v1.6
       if getPlayerStorageValue(cid, 637501) == -2 or getPlayerStorageValue(cid, 637501) >= 1 then  
          BackTeam(cid)       
       end
    end
    -----------------
    local edit = true

    if not pokeball then
        pokeball = getPlayerSlotItem(cid, ?
    end

    if blockevo then
        edit = false
        doPlayerSendCancel(cid, "Your pokemon couldn't evolve due to server mistakes, please wait until we fix the problem.")
    end

    local happy = getPlayerStorageValue(pokemon, 1008)
    local hunger = getPlayerStorageValue(pokemon, 1009)
    local pokelife = (getCreatureHealth(pokemon) / getCreatureMaxHealth(pokemon))

    if edit then
        doItemSetAttribute(pokeball.uid, "happy", happy)
        doItemSetAttribute(pokeball.uid, "hunger", hunger)
        doItemSetAttribute(pokeball.uid, "hp", pokelife)
    end

--    if getCreatureName(pokemon) == "Ditto" then
--        if isTransformed(pokemon) then
    --        local left = getItemAttribute(pokeball.uid, "transLeft") - (os.clock() - getItemAttribute(pokeball.uid, "transBegin"))
    --        doItemSetAttribute(pokeball.uid, "transLeft", left)
    --    end
--    end

    if hideeffects then
        doRemoveCreature(pokemon)
    return true
    end

    local pokename = getPokeName(pokemon)

    local mbk = gobackmsgs[math.random(1, #gobackmsgs)].back:gsub("doka", pokename)

    if getCreatureCondition(cid, CONDITION_INFIGHT) then
        if isCreature(getCreatureTarget(cid)) then
            doItemSetAttribute(pokeball.uid, "happy", happy - 5)
        else
            doItemSetAttribute(pokeball.uid, "happy", happy - 2)
        end
    end

    doTransformItem(pokeball.uid, pokeball.itemid-1)
    doCreatureSay(cid, mbk, 19)

    doSendMagicEffect(getCreaturePosition(pokemon), effect)

    doRemoveCreature(pokemon)

    unLock(pokeball.uid) --alterado v1.8
    
    if useOTClient then
       doPlayerSendCancel(cid, '12//,hide')  --alterado v1.7
    end
    
    if useKpdoDlls then
        doUpdateMoves(cid)
    end

end

local EFFECTS = {
    --[OutfitID] = {Effect}
    ["Magmar"] = 35,                --alterado v1.5
    ["Shiny Magmar"] = 35,
    ["Magby"] = 35,
    ["Jynx"] = 17,   
    ["Smoochum"] = 17, 
    ["Shiny Jynx"] = 17,    
    ["Piloswine"] = 205,  --alterado v1.8
    ["Swinub"] = 205, 
    ["Stantler"] = 205, 
    ["Shiny Stantler"] = 205, 
}

function doGoPokemon(cid, item)

    if getPlayerStorageValue(cid, 17000) >= 1 or getPlayerStorageValue(cid, 17001) >= 1 or getPlayerStorageValue(cid, 63215) >= 1 then
    return true
    end
---------------------------------------------------------------
local ballName = getItemAttribute(item.uid, "poke")

   btype = getPokeballType(item.itemid)                   

    local effect = pokeballs[btype].effect
        if not effect then
            effect = 21
        end
-----------------------------------------------------------------
    if item.uid ~= getPlayerSlotItem(cid, CONST_SLOT_FEET).uid then
        doPlayerSendCancel(cid, "You must put your pokeball in the correct place!")
    return TRUE
    end

    local thishp = getItemAttribute(item.uid, "hp")

    if thishp <= 0 then
        if isInArray(pokeballs[btype].all, item.itemid) then
            doTransformItem(item.uid, pokeballs[btype].off)
            doItemSetAttribute(item.uid, "hp", 0)
            doPlayerSendCancel(cid, "This pokemon is fainted.")
            return true
        end
    end

    local pokemon = getItemAttribute(item.uid, "poke")

    if not pokes[pokemon] then
    return true
    end

----------------------- Sistema de nao poder carregar mais que 3 pokes lvl baixo e + q 1 poke de lvl medio/alto ---------------------------------
if not isInArray({5, 6}, getPlayerGroupId(cid)) then
   local balls = getPokeballsInContainer(getPlayerSlotItem(cid, 3).uid)      --alterado v1.9 \/
   local low = {}
   local lowPokes = {"Rattata", "Caterpie", "Weedle", "Oddish", "Pidgey", "Paras", "Poliwag", "Bellsprout", "Magikarp", "Hoppip", "Sunkern"}
   if #balls >= 1 then
      for _, uid in ipairs(balls) do
          local nome = getItemAttribute(uid, "poke")
          if not isInArray(lowPokes, pokemon) and nome == pokemon then
             return doPlayerSendTextMessage(cid, 27, "Sorry, but you can't carry two pokemons equals!")
          else
             if nome == pokemon then
                table.insert(low, nome)
             end
          end
      end
   end
if #low >= 3 then
   return doPlayerSendTextMessage(cid, 27, "Sorry, but you can't carry more than three pokemons equals of low level!")
end   
end
---------------------------------------------------------------------------------------------------------------------------------------------------

    local x = pokes[pokemon]
    local boosts = getItemAttribute(item.uid, "boost") or 0

    if getPlayerLevel(cid) < (x.level + boosts) then   --alterado v1.8 \/
    doPlayerSendCancel(cid, "You need level "..(x.level + boosts).." to use this pokemon.")
    return true
    end
    
    --------------------------------------------------------------------------------------
    shinysClan = {
    ["Shiny Fearow"] = {4, "Wingeon"},
    ["Shiny Flareon"] = {1, "Volcanic"},
    ["Shiny Vaporeon"] = {2, "Seavel"}, 
    ["Shiny Jolteon"] = {9, "Raibolt"},
    ["Shiny Hypno"] = {7, "Psycraft"},
    ["Shiny Golem"] = {3, "Orebound"},         
    ["Shiny Vileplume"] = {8, "Naturia"},
    ["Shiny Nidoking"] = {5, "Malefic"},
    ["Shiny Hitmontop"] = {6, "Gardestrike"},   
    ["Shiny Metagross"] = {9, "Ironhead"},
    }
    
    if shinysClan[pokemon] and (getPlayerGroupId(cid) < 4 or getPlayerGroupId(cid) > 6) then --alterado v1.9
       if getPlayerStorageValue(cid, 86228) ~= shinysClan[pokemon][1] then
          doPlayerSendCancel(cid, "You need be a member of the clan "..shinysClan[pokemon][2].." to use this pokemon!")
          return true   
       elseif getPlayerStorageValue(cid, 862281) ~= 5 then
          doPlayerSendCancel(cid, "You need be atleast rank 5 to use this pokemon!")
          return true
       end
    end
    --------------------------------------------------------------------------------------

    doSummonMonster(cid, pokemon)

    local pk = getCreatureSummons(cid)[1]
    if not isCreature(pk) then return true end
    
    ------------------------passiva hitmonchan------------------------------
    if isSummon(pk) then                                                  --alterado v1.8 \/
       if pokemon == "Shiny Hitmonchan" or pokemon == "Hitmonchan" then
          if not getItemAttribute(item.uid, "hands") then
             doSetItemAttribute(item.uid, "hands", 0)
          end
          local hands = getItemAttribute(item.uid, "hands")
          doSetCreatureOutfit(pk, {lookType = hitmonchans[pokemon][hands].out}, -1)
       end
    end
    -------------------------------------------------------------------------
    ---------movement magmar, jynx-------------
    if EFFECTS[getCreatureName(pk)] then     
       markPosEff(pk, getThingPos(pk))
       sendMovementEffect(pk, EFFECTS[getCreatureName(pk)], getThingPos(pk))   
    end
    --------------------------------------------------------------------------  

    if getCreatureName(pk) == "Ditto" then

        local left = getItemAttribute(item.uid, "transLeft")
        local name = getItemAttribute(item.uid, "transName")

        if left and left > 0 then
            setPlayerStorageValue(pk, 1010, name)
            doSetCreatureOutfit(pk, {lookType = getItemAttribute(item.uid, "transOutfit")}, -1)
            addEvent(deTransform, left * 1000, pk, getItemAttribute(item.uid, "transTurn"))
            doItemSetAttribute(item.uid, "transBegin", os.clock())
        else
            setPlayerStorageValue(pk, 1010, "Ditto")
        end
    end

    if isGhostPokemon(pk) then doTeleportThing(pk, getPosByDir(getThingPos(cid), math.random(0, 7)), false) end

    doCreatureSetLookDir(pk, 2)

    adjustStatus(pk, item.uid, true, true, true)
    doAddPokemonInOwnList(cid, pokemon)

    doTransformItem(item.uid, item.itemid+1)

    local pokename = getPokeName(pk) --alterado v1.7

    local mgo = gobackmsgs[math.random(1, #gobackmsgs)].go:gsub("doka", pokename)
    doCreatureSay(cid, mgo, TALKTYPE_SAY)

    doSendMagicEffect(getCreaturePosition(pk), effect)

    unLock(item.uid) --alterado v1.8

    
local pk = getCreatureSummons(cid)[1]
local pb = getPlayerSlotItem(cid, 8).uid
local look = getItemAttribute(pb,"addon")
if not look then
doSetItemAttribute(pb,"addon",0)

end
if look > 0 then
doSetCreatureOutfit(pk, {lookType = look}, -1)

end    
    if useKpdoDlls then
        doUpdateMoves(cid)
    end
end

function doRegainSpeed(cid)              --alterado v1.9 \/
if not isCreature(cid) then return true end

   local speed = PlayerSpeed
   if isMonster(cid) then
      speed = getSpeed(cid)
   elseif isPlayer(cid) and isInArray({4, 5, 6}, getPlayerGroupId(cid)) then
      speed = 200*getPlayerGroupId(cid) 
   end
   
   doChangeSpeed(cid, -getCreatureSpeed(cid))
   if getCreatureCondition(cid, CONDITION_PARALYZE) == true then
      doRemoveCondition(cid, CONDITION_PARALYZE)
      addEvent(doAddCondition, 10, cid, paralizeArea2)             
   end
    
doChangeSpeed(cid, speed)
return speed
end

function isPosEqualPos(pos1, pos2, checkstackpos)
    if pos1.x ~= pos2.x or pos1.y ~= pos2.y and pos1.z ~= pos2.z then
    return false
    end
    if checkstackpos and pos1.stackpos and pos2.stackpos and pos1.stackpos ~= pos2.stackpos then
    return false
    end
return true
end

function getRandomGenderByName(name)
local rate = newpokedex[name]
    if not rate then return 0 end
    rate = rate.gender
    if rate == 0 then
        gender = 3
    elseif rate == 1000 then
        gender = 4
    elseif rate == -1 then
        gender = 0
    elseif math.random(1, 1000) <= rate then
        gender = 4
    else
        gender = 3
    end
return gender
end

function getRecorderCreature(pos, cid)
    local ret = 0
    if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
       return cid
    end
    local s = {}
    s.x = pos.x
    s.y = pos.y
    s.z = pos.z
        for a = 0, 255 do
            s.stackpos = a
            local b = getTileThingByPos(s).uid
            if b > 1 and isCreature(b) and getCreatureOutfit(b).lookType ~= 814 then
                ret = b
            end
        end
return ret
end

function doCreatureSetOutfit(cid, outfit, time)
    doSetCreatureOutfit(cid, outfit, time)
end

function doMagicalFlower(cid, away)
    if not isCreature(cid) then return true end
    for x = -3, 3 do
        for y = -3, 3 do
        local a = getThingPos(cid)
        a.x = a.x + x
        a.y = a.y + y
            if away then
                doSendDistanceShoot(a, getThingPos(cid), 21)
            else
                doSendDistanceShoot(getThingPos(cid), a, 21)
            end
        end
    end
end        

function isItemPokeball(item)         --alterado v1.9 \/
if not item then return false end
for a, b in pairs (pokeballs) do
    if isInArray(b.all, item) then return true end
    if item >= 12861 and item <= 13781 then
    return true
    end
    if item >= 13797 and item <= 13823 then
    return true
    end
        if item >= 10975 and item <= 10977 then
        return true
    end
    if item >= 13836 and item <= 13850 then
    return true
    end
    if item >= 13851 and item <= 13856 then
    return true
    end
    if item >= 13859 and item <= 13861 then
    return true
    end
    if item >= 13902 and item <= 13904 then
    return true
    end
    if item >= 13919 and item <= 13930 then
    return true
    end
end
return false
end

function isPokeball(item)
if not item then return false end
for a, b in pairs (pokeballs) do
    if isInArray(b.all, item) then return true end
    if item >= 12861 and item <= 13781 then
    return true
    end
    if item >= 13797 and item <= 13823 then
    return true
    end
        if item >= 10975 and item <= 10977 then
        return true
    end
    if item >= 13836 and item <= 13856 then
    return true
    end
end
return false
end
function getPokeballType(id)
    for a, b in pairs (pokeballs) do
        if isInArray(b.all, id) then
            return a
        end
    end
return "none"
end

randomdiagonaldir = {
[NORTHEAST] = {NORTH, EAST},
[SOUTHEAST] = {SOUTH, EAST},
[NORTHWEST] = {NORTH, WEST},
[SOUTHWEST] = {SOUTH, WEST}}

function doFaceOpposite(cid)
local a = getCreatureLookDir(cid)
local d = {
[NORTH] = SOUTH,
[SOUTH] = NORTH,
[EAST] = WEST,
[WEST] = EAST,
[NORTHEAST] = SOUTHWEST,
[NORTHWEST] = SOUTHEAST,
[SOUTHEAST] = NORTHWEST,
[SOUTHWEST] = NORTHEAST}
doCreatureSetLookDir(cid, d[a])
end

function doFaceRandom(cid)
local a = getCreatureLookDir(cid)
local d = {
[NORTH] = {SOUTH, WEST, EAST},
[SOUTH] = {NORTH, WEST, EAST},
[WEST] = {SOUTH, NORTH, EAST},
[EAST] = {SOUTH, WEST, NORTH}}
doChangeSpeed(cid, 1)
doCreatureSetLookDir(cid, d[a][math.random(1, 3)])
doChangeSpeed(cid, -1)
end

function getFaceOpposite(dir)
local d = {
[NORTH] = SOUTH,
[SOUTH] = NORTH,
[EAST] = WEST,
[WEST] = EAST,
[NORTHEAST] = SOUTHWEST,
[NORTHWEST] = SOUTHEAST,
[SOUTHEAST] = NORTHWEST,
[SOUTHWEST] = NORTHEAST}
return d[dir]
end

function getResistance(cid, combat)
    if isPlayer(cid) then return false end
local poketype1 = pokes[getCreatureName(cid)].type
local poketype2 = pokes[getCreatureName(cid)].type2
local multiplier = 1
    if effectiveness[combat].super and isInArray(effectiveness[combat].super, poketype1) then
        multiplier = multiplier * 2
    end
    if poketype2 and effectiveness[combat].super and isInArray(effectiveness[combat].super, poketype2) then
        multiplier = multiplier * 2
    end
    if effectiveness[combat].weak and isInArray(effectiveness[combat].weak, poketype1) then
        multiplier = multiplier * 0.5
    end
    if poketype2 and effectiveness[combat].weak and isInArray(effectiveness[combat].weak, poketype2) then
        multiplier = multiplier * 0.5
    end
    if effectiveness[combat].non and isInArray(effectiveness[combat].non, poketype1) then
        multiplier = multiplier * 0
    end
    if poketype2 and effectiveness[combat].non and isInArray(effectiveness[combat].non, poketype2) then
        multiplier = multiplier * 0
    end

    if multiplier == 0.25 then
        multiplier = 0.5
    elseif multiplier == 4 then
        multiplier = 2
    end

return multiplier
end

function getCreatureDirectionToTarget(cid, target, ranged)
    if not isCreature(cid) then return true end
    if not isCreature(target) then return getCreatureLookDir(cid) end
    local dirs = {
    [NORTHEAST] = {NORTH, EAST},
    [SOUTHEAST] = {SOUTH, EAST},
    [NORTHWEST] = {NORTH, WEST},
    [SOUTHWEST] = {SOUTH, WEST}}
    local x = getDirectionTo(getThingPos(cid), getThingPos(target), false)
        if x <= 3 then return x
        else
            local xdistance = math.abs(getThingPos(cid).x - getThingPos(target).x)
            local ydistance = math.abs(getThingPos(cid).y - getThingPos(target).y)
                if xdistance > ydistance then
                    return dirs[x][2]
                elseif ydistance > xdistance then
                    return dirs[x][1]
                elseif isInArray(dirs[x], getCreatureLookDir(cid)) then
                    return getCreatureLookDir(cid)
                else
                    return dirs[x][math.random(1, 2)]
                end
        end
end

function getSomeoneDescription(cid)
    if isPlayer(cid) then return getPlayerNameDescription(cid) end
return getMonsterInfo(getCreatureName(cid)).description
end
    

function isGhostPokemon(cid)
    if not isCreature(cid) then return false end
    local ghosts = {"Gastly", "Haunter", "Gengar", "Shiny Gengar", "Misdreavus", "Shiny Abra"}
return isInArray(ghosts, getCreatureName(cid))
end

function updateGhostWalk(cid)
    if not isCreature(cid) then return false end
    local pos = getThingPos(cid)
    pos.x = pos.x + 1
    pos.y = pos.y + 1
    local ret = getThingPos(cid)
    doTeleportThing(cid, pos, false)
    doTeleportThing(cid, ret, false)
return true
end

function doRemoveElementFromTable(t, e)
    local ret = {}
    for a = 1, #t do
        if t[a] ~= e then
        table.insert(ret, t[a])
        end
    end
return ret
end

function doFaceCreature(sid, pos)
if not isCreature(sid) then return true end
    if getThingPos(sid).x == pos.x and getThingPos(sid).y == pos.y then return true end
    local ret = 0

    local ld = getCreatureLookDir(sid)
    local dir = getDirectionTo(getThingPos(sid), pos)
    local al = {
    [NORTHEAST] = {NORTH, EAST},
    [NORTHWEST] = {NORTH, WEST},
    [SOUTHEAST] = {SOUTH, EAST},
    [SOUTHWEST] = {SOUTH, WEST}}

    if dir >= 4 and isInArray(al[dir], ld) then return true end

    doChangeSpeed(sid, 1)
        if dir == 4 then
            ret = math.random(2, 3)
        elseif dir == 5 then
            ret = math.random(1, 2)
        elseif dir == 6 then
            local dirs = {0, 3}
            ret = dirs[math.random(1, 2)]
        elseif dir == 7 then
            ret = math.random(0, 1)
        else
            ret = getDirectionTo(getThingPos(sid), pos)
        end
doCreatureSetLookDir(sid, ret)
doChangeSpeed(sid, -1)
return true
end

function doCreatureAddCondition(cid, condition)
if not isCreature(cid) then return true end
doAddCondition(cid, condition)
end

function doCreatureRemoveCondition(cid, condition)
if not isCreature(cid) then return true end
doRemoveCondition(cid, condition)
end

function setCD(item, tipo, tempo)

    if not tempo or not tonumber(tempo) then
        doItemEraseAttribute(item, tipo)
    return true
    end

    doItemSetAttribute(item, tipo, "cd:"..(tempo + os.time()).."")
return tempo + os.time()
end

function getCD(item, tipo, limite)

    if not getItemAttribute(item, tipo) then
    return 0
    end

    local string = getItemAttribute(item, tipo):gsub("cd:", "")
    local number = tonumber(string) - os.time()

    if number <= 0 then
    return 0
    end

    if limite and limite < number then
        return 0
    end

return number
end

function doSendMoveEffect(cid, target, effect)
if not isCreature(cid) or not isCreature(target) then return true end
doSendDistanceShoot(getThingPos(cid), getThingPos(target), effect)
return true
end

function doSetItemActionId(uid, actionid)
doItemSetAttribute(uid, "aid", actionid)
return true
end

function threeNumbers(number)
    if number <= 9 then
    return "00"..number..""
    elseif number <= 99 then
    return "0"..number..""
    end
return ""..number..""
end

function isBr(cid)
if getPlayerStorageValue(cid, 105505) ~= -1 then
return true
end
return false
end

function isBeingUsed(ball)            
if not ball then return false end
for a, b in pairs (pokeballs) do           --alterado v1.9
    if b.use == ball then return true end
end
return false
end

function doRemoveTile(pos)-- Script by mock
pos.stackpos = 0
local sqm = getTileThingByPos(pos)
doRemoveItem(sqm.uid,1)
end

function doCreateTile(id,pos) -- By mock
doAreaCombatHealth(0,0,pos,0,0,0,CONST_ME_NONE)
doCreateItem(id,1,pos)
end

function hasSqm(pos)
local f = getTileThingByPos(pos)
if f.itemid ~= 0 and f.itemid ~= 1 then
return true
end
return false
end

function getPosDirs(p, dir) -- By MatheusMkalo
return dir == 1 and {x=p.x-1, y=p.y, z=p.z} or dir == 2 and {x=p.x-1, y=p.y+1, z=p.z} or dir == 3 and {x=p.x, y=p.y+1, z=p.z} or dir == 4 and {x=p.x+1, y=p.y+1, z=p.z} or dir == 5 and {x=p.x+1, y=p.y, z=p.z} or dir == 6 and {x=p.x+1, y=p.y-1, z=p.z} or dir == 7 and {x=p.x, y=p.y-1, z=p.z} or dir == 8 and {x=p.x-1, y=p.y-1, z=p.z}
end

function canWalkOnPos(pos, creature, pz, water, sqm, proj)
if not pos then return false end
if not pos.x then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid <= 1 and sqm then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 919 then return false end
if isInArray({4820, 4821, 4822, 4823, 4824, 4825}, getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false end
    local n = not proj and 3 or 2                                    --alterado v1.6
    for i = 0, 255 do
        pos.stackpos = i                           
        local tile = getTileThingByPos(pos)        
        if tile.itemid ~= 0 and i ~= 253 and not isCreature(tile.uid) then     --edited
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end   
return true
end

function canWalkOnPos2(pos, creature, pz, water, sqm, proj)     --alterado v1.6
if not pos then return false end
if not pos.x then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid <= 1 and sqm then return false end
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 919 then return false end
if isInArray({4820, 4821, 4822, 4823, 4824, 4825}, getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false end
    --[[local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i                           --edited pra retirar um bug.. ;x
        local tile = getTileThingByPos(pos)        
        if tile.itemid ~= 0 and i ~= 253 and not isCreature(tile.uid) then     --edited
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end ]]  
return true
end

function getFreeTile(pos, cid)
    if canWalkOnPos(pos, true, false, true, true, false) then
        return pos
    end
    local positions = {}
    for a = 0, 7 do
        if canWalkOnPos(getPosByDir(pos, a), true, false, true, true, false) then
        table.insert(positions, pos)
        end
    end
    if #positions >= 1 then
        if isCreature(cid) then
            local range = 1000
            local ret = getThingPos(cid)
            for b = 1, #positions do
                if getDistanceBetween(getThingPos(cid), positions) < range then
                    ret = positions
                    range = getDistanceBetween(getThingPos(cid), positions)
                end
            end
            return ret
        else
            return positions[math.random(#positions)]
        end
    end
return getThingPos(cid)
end

function isWalkable(pos, creature, proj, pz, water)-- by Nord
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
    if getTopCreature(pos).uid > 0 and creature then return false end
    if getTileInfo(pos).protection and pz then return false, true end
    local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i
        local tile = getTileThingByPos(pos)
        if tile.itemid ~= 0 and not isCreature(tile.uid) then
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end
    return true
end


function isPlayerSummon(cid, uid)
return getCreatureMaster(uid) == cid  --alterado v1.9
end

function isSummon(sid)
return isCreature(sid) and getCreatureMaster(sid) ~= sid and isPlayer(getCreatureMaster(sid))   --alterado v1.9
end 

function getItemsInContainerById(container, itemid) -- Function By Kydrai
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
   for slot=0, (getContainerSize(container)-1) do
       local item = getContainerItem(container, slot)
       if isContainer(item.uid) then
          local itemsbag = getItemsInContainerById(item.uid, itemid)
          for i=0, #itemsbag do
              table.insert(items, itemsbag)
          end
       else
          if itemid == item.itemid then
             table.insert(items, item.uid)
          end
       end
   end
end
return items
end

function getPokeballsInContainer(container) -- Function By Kydrai
    if not isContainer(container) then return {} end
    local items = {}
    if isContainer(container) and getContainerSize(container) > 0 then
        for slot=0, (getContainerSize(container)-1) do
            local item = getContainerItem(container, slot)
                if isContainer(item.uid) then
                    local itemsbag = getPokeballsInContainer(item.uid)
                    for i=0, #itemsbag do
                        table.insert(items, itemsbag)
                    end
                elseif isPokeball(item.itemid) then
                    table.insert(items, item.uid)
                end
        end
    end
return items
end

function getItensUniquesInContainer(container)    --alterado v1.6
if not isContainer(container) then return {} end
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
   for slot=0, (getContainerSize(container)-1) do
       local item = getContainerItem(container, slot)
       if isContainer(item.uid) then
          local itemsbag = getItensUniquesInContainer(item.uid)
          for i=0, #itemsbag do
              table.insert(items, itemsbag)
          end
       elseif getItemAttribute(item.uid, "unique") then
          table.insert(items, item)
       end
   end
end
return items
end

function hasSpaceInContainer(container)                --alterado v1.6
if not isContainer(container) then return false end
if getContainerSize(container) < getContainerCap(container) then return true end

for slot = 0, (getContainerSize(container)-1) do
    local item = getContainerItem(container, slot)
    if isContainer(item.uid) then
       if hasSpaceInContainer(item.uid) then
          return true
       end
    end
end
return false
end

function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo
local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
   for i,x in pairs(item) do
       if getThing(x).type < 100 then
          local it = getThing(x)
          doTransformItem(it.uid, itemid, it.type+quant)
          if it.type+quant > 100 then
             doPlayerAddItem(cid, itemid, it.type+quant-100)
          end
       else
          piles = piles+1
       end
   end
else
   return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
   doPlayerAddItem(cid, itemid, quant)
end
end

function getPlayerInArea(fromPos, toPos) -- by jhon992
local online = getPlayersOnline()
local players = {}
for i=1, #online do
    if isInArea(getPlayerPosition(online), fromPos, toPos) then
        players[#players+1] = online
    end
end
return players
end
function isPlayerOnline(uid)
    return isInArray(getPlayersOnline(), uid)
end

function doRegenerateWithY(cid, sid)
if isPlayerOnline(cid) then
local ball = getPlayerSlotItem(cid, ? or getPlayerSlotItem(getCreatureMaster(cid), ?
local Tiers = {
[1] = {bonus = Regen1},
[2] = {bonus = Regen2},
[3] = {bonus = Regen3},
[4] = {bonus = Regen4},
[5] = {bonus = Regen5},
[6] = {bonus = Regen6},
[7] = {bonus = Regen7},
}
if isPlayer(cid) and #getCreatureSummons(cid) > 0 then
local Tier = getItemAttribute(ball.uid, "heldy")
if Tier and Tier > 0 and Tier < 8 then
if not getCreatureCondition(cid, CONDITION_INFIGHT) then
if getCreatureHealth(sid) < getCreatureMaxHealth(sid) then
addEvent(function() doCreatureAddHealth(sid,Tiers[Tier].bonus) doSendAnimatedText(getThingPos(sid), "+ "..Tiers[Tier].bonus, 30) end, 0)
end
addEvent(doRegenerateWithY, 1000, cid, sid)  
else
addEvent(doRegenerateWithY, 1000, cid, sid)
end
end   
end
end 
end

function doCureWithY(cid, sid)
if isPlayerOnline(cid) then
local ball = getPlayerSlotItem(cid, ? or getPlayerSlotItem(getCreatureMaster(cid), ?
local Tiers = {
[8] = {chance = Cure1},
[9] = {chance = Cure2},
[10] = {chance = Cure3},
[11] = {chance = Cure4},
[12] = {chance = Cure5},
[13] = {chance = Cure6},
[14] = {chance = Cure7},
}
local Tier = getItemAttribute(ball.uid, "heldy")
if isPlayer(cid) and #getCreatureSummons(cid) > 0  and Tier then
if Tier > 7 and Tier < 15 then
if math.random(1,100) <= Tiers[Tier].chance then
doCureStatus(sid, "all")
doSendMagicEffect(getThingPosWithDebug(sid), 14)
end
addEvent(doCureWithY, 1000, cid, sid)  
end
end
end   
end
function doPlayerAddItemStacking(cid, itemid, quant)


local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
for i,x in pairs(item) do
if getThing(x).type < 100 then
local it = getThing(x)
doTransformItem(it.uid, itemid, it.type+quant)
if it.type+quant > 100 then
doPlayerAddItem(cid, itemid, it.type+quant-100)
end
else
piles = piles+1
end
break
end
else
return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
doPlayerAddItem(cid, itemid, quant)
end
end

function getDirectionToWalk(p1, pos2)
    local dir = NORTH
    local pos1 = getCreaturePosition(p1)
    if(pos1.x > pos2.x) then
        dir = WEST
        if(pos1.y > pos2.y) then
            dir = NORTHWEST
        elseif(pos1.y < pos2.y) then
            dir = SOUTHWEST
        end
    elseif(pos1.x < pos2.x) then
        dir = EAST
        if(pos1.y > pos2.y) then
            dir = NORTHEAST
        elseif(pos1.y < pos2.y) then
            dir = SOUTHEAST
        end
    else
        if(pos1.y > pos2.y) then
            dir = NORTH
        elseif(pos1.y < pos2.y) then
            dir = SOUTH
        end
    end
    return dir
end

 function getNextStepDelay(cid, dir)
            return tonumber(398)
    end      
    
    
    function getRecorderPlayer(pos, cid)
    local ret = 0
    if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
       return cid
    end
    local s = {}
    s.x = pos.x
    s.y = pos.y
    s.z = pos.z
        for a = 0, 255 do
            s.stackpos = a
            local b = getTileThingByPos(s).uid
            if b > 1 and isPlayer(b) and getCreatureOutfit(b).lookType ~= 814 then
                ret = b
            end
        end
return ret
end

function getRecorderCreature(pos, cid)
    local ret = 0
    if cid and isPosEqual(getThingPos(cid), pos) then   --alterado v1.9
       return cid
    end
    local s = {}
    s.x = pos.x
    s.y = pos.y
    s.z = pos.z
        for a = 0, 255 do
            s.stackpos = a
            local b = getTileThingByPos(s).uid
            if b > 1 and isCreature(b) and getCreatureOutfit(b).lookType ~= 814 then
                ret = b
            end
        end
return ret
end

function hasTile(pos)    --Verifica se tem TILE na pos
pos.stackpos = 0
if getTileThingByPos(pos).itemid >= 1 then
   return true
end
return false
end
function doPlayerAddItemStacking(cid, itemid, quant)


local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
local piles = 0
if #item > 0 then
for i,x in pairs(item) do
if getThing(x).type < 100 then
local it = getThing(x)
doTransformItem(it.uid, itemid, it.type+quant)
if it.type+quant > 100 then
doPlayerAddItem(cid, itemid, it.type+quant-100)
end
else
piles = piles+1
end
break
end
else
return doPlayerAddItem(cid, itemid, quant)
end
if piles == #item then
doPlayerAddItem(cid, itemid, quant)
end
end

function isFly(cid)
   if getPlayerStorageValue(cid, orderTalks["fly"].storage) == 1 then
      return true 
   end
   return false
end


function doOTCSendPokemonHealth(cid)
    local ball = getPlayerSlotItem(cid, CONST_SLOT_FEET)
    local pokemon = getCreatureSummons(cid)
    if not ball.uid or ball.uid <= 1 then
        return doSendPlayerExtendedOpcode(cid, 122, "0|0")
    end
    if #pokemon >= 1 then
        return doSendPlayerExtendedOpcode(cid, 122, getCreatureHealth(pokemon[1]).."|"..getCreatureMaxHealth(pokemon[1]))
    end
end

---- FUNÇÃO SELF ATTACK CREATURE ----
function selfAttackCreature()
if #getCreatureSummons(getNpcCid()) > 0 and not isCreature(getCreatureTarget(getCreatureSummons(getNpcCid())[1])) then
    local list = getSpectators(getCreaturePosition(getNpcCid()), 7, 7, false)
    for i=0, table.getn(list) do
        local _target = list
        if(_target ~= 0) then
            if isPlayer(_target) and not getTileInfo(getThingPos(_target)).protection then
                if #getCreatureSummfighting = falseons(_target) > 0 then
                    doMonsterSetTarget(getCreatureSummons(getNpcCid())[1], getCreatureSummons(_target)[1])
                    setPlayerStorageValue(getCreatureSummons(getNpcCid())[1], 99856201, getNpcCid())
                else
                  fighting = false
                end
                target = _target
                break
            end
        end
    end
end

end

 

Pronto, já está adicionado! Só lembrando que tirei o local porque essa vai ser uma função global, ou seja, vai poder ser usada em qualquer outro arquivo da pasta Data do servidor.

 

Testa agora e vê se resolve seu problema.

Deu este BUG ao liga o server

Spoiler

[16/07/2020 22:47:05] [Error - LuaScriptInterface::loadFile] data/lib/some functions.lua:1977: 'then' expected near '='
[16/07/2020 22:47:05] [Warning - LuaScriptInterface::initState] Cannot load data/lib/
[16/07/2020 22:47:05] [Error - LuaScriptInterface::loadFile] data/lib/some functions.lua:1977: 'then' expected near '='
[16/07/2020 22:47:05] [Warning - LuaScriptInterface::initState] Cannot load data/lib/

 

Link para o comentário
Compartilhar em outros sites

  • 0
11 horas atrás, BrunooMaciell disse:

Deu este BUG ao liga o server

  Ocultar conteúdo

[16/07/2020 22:47:05] [Error - LuaScriptInterface::loadFile] data/lib/some functions.lua:1977: 'then' expected near '='
[16/07/2020 22:47:05] [Warning - LuaScriptInterface::initState] Cannot load data/lib/
[16/07/2020 22:47:05] [Error - LuaScriptInterface::loadFile] data/lib/some functions.lua:1977: 'then' expected near '='
[16/07/2020 22:47:05] [Warning - LuaScriptInterface::initState] Cannot load data/lib/

 

O erro está nessa linha:

if #getCreatureSummfighting = falseons(_target) > 0 then

Não tem sentido algum a expressão no if. Mude para :

if #getCreatureSummons(_target) > 0 then

 

Estou me baseando no seu outro próprio post: 

 

Então a função vai ficar:

function selfAttackCreature()
if #getCreatureSummons(getNpcCid()) > 0 and not isCreature(getCreatureTarget(getCreatureSummons(getNpcCid())[1])) then
    local list = getSpectators(getCreaturePosition(getNpcCid()), 7, 7, false)
    for i=0, table.getn(list) do
        local _target = list
        if(_target ~= 0) then
            if isPlayer(_target) and not getTileInfo(getThingPos(_target)).protection then
                if #getCreatureSummons(_target) > 0 then
                    doMonsterSetTarget(getCreatureSummons(getNpcCid())[1], getCreatureSummons(_target)[1])
                    setPlayerStorageValue(getCreatureSummons(getNpcCid())[1], 99856201, getNpcCid())
                else
                  fighting = false
                end
                target = _target
                break
            end
        end
    end
end

end

Só substituir no Some Functions.lua onde coloquei para você, ou apenas trocar a linha acima.

 

A linha alterada foi o que o Nociam te respondeu no seu outro post, ai tem que testar para ver se funciona. Mas, como ele recomendou nesse post recente:

Deve ter funcionado.

 

Teste e avise se der problema.

Link para o comentário
Compartilhar em outros sites

  • 0
2 horas atrás, Yan18 disse:

O erro está nessa linha:


if #getCreatureSummfighting = falseons(_target) > 0 then

Não tem sentido algum a expressão no if. Mude para :


if #getCreatureSummons(_target) > 0 then

 

Estou me baseando no seu outro próprio post: 

 

Então a função vai ficar:


function selfAttackCreature()
if #getCreatureSummons(getNpcCid()) > 0 and not isCreature(getCreatureTarget(getCreatureSummons(getNpcCid())[1])) then
    local list = getSpectators(getCreaturePosition(getNpcCid()), 7, 7, false)
    for i=0, table.getn(list) do
        local _target = list
        if(_target ~= 0) then
            if isPlayer(_target) and not getTileInfo(getThingPos(_target)).protection then
                if #getCreatureSummons(_target) > 0 then
                    doMonsterSetTarget(getCreatureSummons(getNpcCid())[1], getCreatureSummons(_target)[1])
                    setPlayerStorageValue(getCreatureSummons(getNpcCid())[1], 99856201, getNpcCid())
                else
                  fighting = false
                end
                target = _target
                break
            end
        end
    end
end

end

Só substituir no Some Functions.lua onde coloquei para você, ou apenas trocar a linha acima.

 

A linha alterada foi o que o Nociam te respondeu no seu outro post, ai tem que testar para ver se funciona. Mas, como ele recomendou nesse post recente:

Deve ter funcionado.

 

Teste e avise se der problema.

Agora sim ^^

 

So que deu um erro de npc agora eu ate imagino oque e porem fui na script do npc e nao achei os pokemons que deu erro

 

BUG

Spoiler

[17/07/2020 11:58:27] Error in npc: Hunter, tring to execute function 'doSummonGymPokemon', poke: Octopus Octillery
[17/07/2020 11:58:28] Error in npc: Hunter, tring to execute function 'doSummonGymPokemon', poke: Elder Electabuzz
[17/07/2020 11:58:28] Error in npc: Hunter, tring to execute function 'doSummonGymPokemon', poke: Bone Marowak
[17/07/2020 11:58:28] Error in npc: Hunter, tring to execute function 'doSummonGymPokemon', poke: Master Stantler
[17/07/2020 11:58:29] Error in npc: Hunter, tring to execute function 'doSummonGymPokemon', poke: Tribal Scyther

 

[17/07/2020 11:58:29] [Error - Npc interface] 
[17/07/2020 11:58:29] data/npc/scripts/pvp/.aHunter.lua:onThink
[17/07/2020 11:58:29] Description: 
[17/07/2020 11:58:29] (luaGetThingFromPos) Tile not found

SCRIPT DO NPC

Spoiler

local target = 0
local prevTarget = 0
local origPos = 0
local max_distance = 12
local fighting = false
local challenger = 0
local battle_turn = 1        -- don't change
local challenger_turn = 0    -- don't change
---
--/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--
local function doSummonGymPokemon(npc)
    local this = npc
    if not isCreature(this) or not ehNPC(this) then return true end  --alterado v1.6
    if #getCreatureSummons(this) >= 1 or target == 0 then return true end
    local it = wildHunter[getPlayerStorageValue(this, 665471)][battle_turn]
    if not it then return true end
    doSummonMonster(this, it.name)              
    local summon = getCreatureSummons(this)[1]
    if not summon then                                              --alterado v1.6
       print("Error in npc: "..getCreatureName(this)..", tring to execute function 'doSummonGymPokemon', poke: "..it.name)
       battle_turn = battle_turn+1
       return true 
    end
    local balleffect = pokeballs["normal"].effect
        if it.ball and pokeballs[it.ball] then
            balleffect = pokeballs[it.ball].effect
        end
    doSendMagicEffect(getThingPos(summon), balleffect)
    setPlayerStorageValue(summon, 10000, balleffect)
    setPlayerStorageValue(summon, 10001, gobackmsgs[math.random(#gobackmsgs)].back:gsub("doka", it.nick ~= "" and it.nick or it.name))
    setPlayerStorageValue(summon, 1007, it.nick ~= "" and it.nick or it.name)
    doSetMonsterGym(summon, target)
    addEvent(adjustWildPoke, 15, summon, it.optionalLevel)
    if it.nick ~= "" then doCreatureSetNick(summon, it.nick) end
    local name = it.nick ~= "" and it.nick or getCreatureName(this).."s "..it.name    --alterado v1.3
    doCreatureSay(this, gobackmsgs[math.random(#gobackmsgs)].go:gsub("doka", getPlayerStorageValue(summon, 1007)), 1)
    fighting = true
    battle_turn = battle_turn + 1
end
--/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--
local function goToOrigPos()
target = 0
selfFollow(0)
fighting = false
challenger = 0
challenger_turn = 0
if #getCreatureSummons(getNpcCid()) >= 1 then
   setPlayerStorageValue(getCreatureSummons(getNpcCid())[1], 1006, 0)
   doCreatureAddHealth(getCreatureSummons(getNpcCid())[1], -getCreatureMaxHealth(getCreatureSummons(getNpcCid())[1]))
end
doChangeSpeed(getNpcCid(), -getCreatureSpeed(getNpcCid()))
doTeleportThing(getNpcCid(), origPos)
end
--/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--
local function updateTarget()
if(target == 0) then
    local list = getSpectators(getNpcPos(), 9, 9, false)
    for i = 1, table.getn(list) do
        local _target = list
        if(_target ~= 0) then
           if isPlayer(_target) and not getTileInfo(getThingPos(_target)).protection then --alterado v1.8
              selfSay(hunterTalks[math.random(#hunterTalks)])
              doNpcSetCreatureFocus(_target) 
              target = _target
              prevTarget = target
              break
           end
        end
    end
end
end
--/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--
function onCreatureAppear(cid)
end

function onCreatureDisappear(cid)
end

function onCreatureMove(creature, oldPos, newPos)
--
end
--/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--
function onThink()
if not isCreature(getNpcCid()) then return false end  --alterado v1.6
if origPos == 0 then
   origPos = getNpcPos()
end
if getPlayerStorageValue(getNpcCid(), 665471) <= 0 then
   setPlayerStorageValue(getNpcCid(), 665471, math.random(1, 5))
   randOutfit(getNpcCid())
end
updateTarget()
------------------------------------------------------
if getDistanceBetween(getNpcPos(), origPos) >= max_distance or (isCreature(target) and getTileInfo(getThingPos(target)).protection) or getTileInfo(getThingPos(getNpcCid())).protection then  
goToOrigPos()                                                                                                                          --alterado v1.9
end
------------------------------------------------------
if(target == 0) then
if getPlayerStorageValue(getNpcCid(), 154788) <= 0 then
   setPlayerStorageValue(getNpcCid(), 154788, 1)
   doChangeSpeed(getNpcCid(), -getCreatureSpeed(getNpcCid()))
   addEvent(randWalk, 2000, getNpcCid(), 1000, getPlayerStorageValue(getNpcCid(), 154788))
end
return true
end 
------------------------------------------------------
local playerPos = getThingPosWithDebug(target)   --alterado v1.6
local myPos = getNpcPos()
------------------------------------------------------
if(myPos.z ~= playerPos.z) then
goToOrigPos()
battle_turn = battle_turn == 1 and battle_turn or battle_turn-1
return true
end
------------------------------------------------------
if getDistanceBetween(playerPos, myPos) > max_distance then
goToOrigPos()
battle_turn = battle_turn == 1 and battle_turn or battle_turn-1
return true
end
------------------------------------------------------
if getDistanceBetween(playerPos, myPos) >= 5 then
if getPlayerStorageValue(getNpcCid(), 154788) >= 1 then
   setPlayerStorageValue(getNpcCid(), 154788, -1)
   doRegainSpeed(getNpcCid()) 
   if isCreature(target) then
      selfFollow(target)
   end
end
end
------------------------------------------------------
if getDistanceBetween(playerPos, myPos) <= 3 then
if getPlayerStorageValue(getNpcCid(), 154788) <= 0 then
   setPlayerStorageValue(getNpcCid(), 154788, 1)
   doChangeSpeed(getNpcCid(), -getCreatureSpeed(getNpcCid()))
   addEvent(randWalk, 2000, getNpcCid(), 1000, getPlayerStorageValue(getNpcCid(), 154788))
end
end
------------------------------------------------------
if getDistanceBetween(playerPos, myPos) <= 5 then
   challenger = target
   addEvent(doSummonGymPokemon, 1000, getNpcCid())

local change = false

if not isCreature(target) then
   target = 0
   battle_turn = battle_turn == 1 and battle_turn or battle_turn-1
   return true
end

if fighting then

   if not isCreature(getCreatureTarget(getNpcCid())) then
      if #getCreatureSummons(challenger) >= 1 then
         selfAttackCreature(getCreatureSummons(challenger)[1])
         change = true
      else
          if change then
             change = false
             challenger_turn = challenger_turn + 1
          end
      end
   end
        
   if #getCreatureSummons(getNpcCid()) == 0 and isCreature(target) then
      if battle_turn > #wildHunter[getPlayerStorageValue(getNpcCid(), 665471)] then      
         addEvent(doCreateNpc, 300000, ".aHunter", myPos)  --alterado v1.5
         local outfit = getCreatureOutfit(getNpcCid())
         doRemoveCreature(getNpcCid())
         ----------------------------------------
         if outfit.lookType == 1016 then      --verifica se o npc eh female.. ?
             monster = doCreateMonster("aHunterFemale", myPos)
         else
             monster = doCreateMonster("aHunter", myPos)
         end
         ----------------------------------------
         doCloneOut(monster, outfit)
         addEvent(beDrunk, 100, monster)
      end
         addEvent(doSummonGymPokemon, 1000, getNpcCid())
   end

   if #getCreatureSummons(challenger) <= 0 then
      selfAttackCreature(challenger) 
   end  
end
end
end

 

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...