Ir para conteúdo

Dwarfer

Membro
  • Registro em

  • Última visita

Tudo que Dwarfer postou

  1. Boa, só: CreatureClass -> ClassCreature ?
  2. Vê se assim te serve, não tive como testá-lo:
  3. Em creaturescripts/scripts crie um arquivo.lua e cole isto dentro: local group_id = 1 -- abaixo ou igual a esse grupo receberá a skull function onLogin(cid) if getPlayerGroupId(cid) <= group_id then if getCreatureSkullType(cid) == SKULL_NONE then doCreatureSetSkullType(cid, SKULL_WHITE) end end return true end No creaturescripts.xml, adicione a tag: <event type="login" name="SetaSkull" event="script" value="NOMEDOARQUIVO.lua"/>
  4. local evo = { --nome do shiny, qnts stones precisa ["Snorlax"] = {"Shiny Snorlax", 5}, ["Gengar"] = {"Shiny Gengar", 7}, ["Ninetales"] = {"Shiny Ninetales", 4}, ["Raichu"] = {"Shiny Raichu", 5}, ["Alakazam"] = {"Shiny Alakazam", 7}, } local pokeballs = { [2531] = {newBall = 1111}, -- edite o "1111" para o id para o qual a pokeball 2531 se transformará [2557] = {newBall = 1111}, [2524] = {newBall = 1111}, [2525] = {newBall = 1111}, [2523] = {newBall = 1111}, } function onUse(cid, item, fromPosition, itemEx, toPosition) if isMonster(itemEx.uid) and getCreatureMaster(itemEx.uid) == cid then local monster = getCreatureName(itemEx.uid) if evo[monster] then if getPlayerItemCount(cid, item.itemid) >= evo[monster][2] then doPlayerSendTextMessage(cid, 27, "Congratulations! Your "..getPokeName(itemEx.uid).." evolved into a "..evo[monster][1].."!") local health, maxHealth = getCreatureHealth(itemEx.uid), getCreatureMaxHealth(itemEx.uid) doSendMagicEffect(getThingPos(itemEx.uid), 18) doRemoveCreature(itemEx.uid) doPlayerRemoveItem(cid, item.itemid, evo[monster][2]-1) doRemoveItem(item.uid, 1) doSummonMonster(cid,evo[monster][1]) local pokeball = getPlayerSlotItem(cid, 8) doItemSetAttribute(pokeball.uid, "poke", evo[monster][1]) doItemSetAttribute(pokeball.uid, "level", pokes[evo[monster][1]].level) doItemSetAttribute(pokeball.uid, "hp", 1) doItemSetAttribute(pokeball.uid, "happy", 110) local pk = getCreatureSummons(cid)[1] local getShinyPokeballs = pokeballs[getPlayerSlotItem(cid, 8).itemid] if getShinyPokeBalls then doTransformItem(getPlayerSlotItem(cid, 8).uid, getShinyPokeballs.newBall) adjustStatus(pk, pokeball.uid, true, false, true) end return true else return doPlayerSendTextMessage(cid, 27, "You need atleast ".. evo[monster][2] .." stones to do it!") end end end return false end
  5. Dwarfer postou uma resposta no tópico em Eventos de Mapping
    Em minha opinião o mapa 2 retratou quase que perfeitamente uma mina, gostei bastante dos trilhos à mostra, o que confere originalidade ao mapa. Com certeza eu moraria nessa mina aí! ? Voto: Mapa 2
  6. @Navegante Em actions/scripts crie um arquivo.lua e cole isto dentro: No actions.xml, coloque a tag como o exemplo abaixo, inserindo um actionid no lugar do XXXX e o mesmo valor para o actionid do baú. <action actionid="XXXX" script="NOMEDOSEUARQUIVO.lua"/>
  7. @biellhb Crie um arquivo em actions/scripts e cole isto dentro: Imagem mostrando as posições: https://prnt.sc/klnthu Em actions.xml, adicione a tag: <action actionid="XXXX" script="NOMEDOARQUIVO.lua"/> Coloque um actionid em XXXX e esse mesmo actionid na porta.
  8. @iury alves potter Se eu entendi o que você quis dizer com " os pontos do meu servido e só points não tem storage ou item nada, e so points": Caso ainda não tenha essas funções, copie isso abaixo e cole em algum arquivo da pasta lib: function getPremiumPoints(cid) local query = db.getResult("SELECT `premium_points` FROM `accounts` WHERE `id` = "..getPlayerAccountId(cid)) local points = query:getDataInt("premium_points") <= 0 and 0 or query:getDataInt("premium_points") query:free() return tonumber(points) end function setPremiumPoints(cid, amount) return db.executeQuery("UPDATE `accounts` SET `premium_points` = "..amount.." WHERE `id` = "..getPlayerAccountId(cid)) end O script fica: local t = { storage = 9999, points = 10, -- quantos pontos vai custar looktype = 2192 } function onSay(cid, words, param) if getPlayerStorageValue(cid, t.storage) >= 1 then doPlayerSendTextMessage(cid, 22, "Desculpe voce ja comprou essa outift") return true end if getPremiumPoints(cid) < t.points then doPlayerSendTextMessage(cid, 22, "Você não tem "..t.points.." ponto"..(t.points > 1 and "s" or "")..".") return true end doPlayerAddOutfit(cid, t.looktype, 3) setPlayerStorageValue(cid, t.storage, 1) doPlayerSendTextMessage(cid, 22, "Você comprou a outift.") setPremiumPoints(cid, getPremiumPoints(cid) - t.points) return true end
  9. @Kamiz Bem, respondendo de forma bem superficial e de maneira que seja mais fácil o entendimento: 1) Quando eu crio uma função na lib, como eu usaria ela nos scripts normais? As funções localizadas na lib estão acessíveis em qualquer outro script localizado em actions/movements/talkactions, nas demais pastas também. Usar uma função localizada na lib é da mesma forma que a função localizada no próprio script tanto declarada localmente quanto globalmente. O diferencial é que ela se torna 'visível' para as demais pastas de trabalho. 2) Adicionando a função que criei junto com o arquivo eu poderia usar ela de forma global no servidor? Sim, após declarar o diretório do arquivo localizado na lib, você poderá usar a função como falei na pergunta 1. 3) Quais as vantagens de criar funções em lua? As vantagens são as mesmas para que quase todas as linguagens. Organização do código, 'reunir' ações repetitivas em um bloco mais simples, conferir maior flexibilidade ao código (mais fácil ser editado, atualizado). 4) Quando eu devo utilizar uma função C++ direto nas sources e quando eu devo criar uma lib para isso? Na verdade a questão de utilizar uma função C++ direto nas sources ou criar uma lib não tem relação. O ponto é que em algumas situações não é possível criar um código utilizando Lua (independente de estar na lib ou não) com base nas funções já existentes e adicionadas à source. Nesse caso, você precisa adicionar/criar uma função C++ que atenda às suas necessidades. Com o tempo, ao se tornar um pouco mais experiente, você vai perceber que existem limitações que impedem certas ações nos scripts, falando de forma bem simplória. Aqui vai um exemplo genérico e simples que acredito ajudar a entender as vantagens de usar funções: Ao clicar em um item, enviar mensagem para todos os players em determinada área: - Em data/actions/scripts no arquivo sendmsg.lua: local area = {{x=1,y=1,z=1}, {x=2,y=2,z=2}} function onUse(cid, item, fromPosition, itemEx, toPosition) if getPlayerVocation(cid) == 1 then if getPlayerLevel(cid) < 100 then doPlayerSendCancel(cid, "Você possui level menor que 100.") return true end for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Sorcerer usou o item.") end end doCreatureSay(cid, "Sou um sorcerer.", TALKTYPE_SAY) elseif getPlayerVocation(cid) == 2 then doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Druid usou o item.") end end elseif getPlayerVocation(cid) == 3 then doCreateMonster("Demon", getPlayerPosition(cid)) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Paladin usou o item.") end end end return true end Perceba que o bloco que envia mensagem para os players que estão em uma área se repete várias vezes: for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Druid usou o item.") end end Poderia ser feita uma função para enviar mensagem para jogadores em uma área: function enviarMsgEmArea(msg, area_from, area_to) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area_from, area_from) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, msg) end end end E o script se tornaria algo como: local area = {{x=1,y=1,z=1}, {x=2,y=2,z=2}} function onUse(cid, item, fromPosition, itemEx, toPosition) if getPlayerVocation(cid) == 1 then if getPlayerLevel(cid) < 100 then doPlayerSendCancel(cid, "Você possui level menor que 100.") return true end enviarMsgEmArea("Um Sorcerer usou o item.", area[1], area[2]) doCreatureSay(cid, "Sou um sorcerer.", TALKTYPE_SAY) elseif getPlayerVocation(cid) == 2 then doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN) enviarMsgEmArea("Um Druid usou o item.", area[1], area[2]) elseif getPlayerVocation(cid) == 3 then doCreateMonster("Demon", getPlayerPosition(cid)) enviarMsgEmArea("Um Paladin usou o item.", area[1], area[2]) end return true end function enviarMsgEmArea(msg, area_from, area_to) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area_from, area_from) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, msg) end end end Percebeu a diferença? Caso a função estivesse na lib, ela poderia ser usada em um script que ao usar um comando !msg (na pasta talkactions) envia certa mensagem para os players de uma área ou mesmo ao pisar em certo local e fazer a mesma coisa caso o script estivesse na pasta movements. Bem, foi algo muito superficial e em uma linguagem para que pudesse entender. Espero ter ajudado.
  10. Bem, resolvi trazer duas funções simples que já utilizo há um bom tempo e que creio que é realmente útil para o desenvolvimento de alguns scripts que envolvem operações com "tempo". Basicamente, elas evitam aqueles comentários "-- tempo em segundos" ou "-- tempo em minutos" e por aí vai, que acabam por diminuir a flexibilidade do script (uma das maiores vantagens da nossa querida linguagem Lua!). São elas: mathtime function mathtime(table) -- by dwarfer local unit = {"sec", "min", "hour", "day"} for i, v in pairs(unit) do if v == table[2] then return table[1]*(60^(v == unit[4] and 2 or i-1))*(v == unit[4] and 24 or 1) end end return error("Bad declaration in mathtime function.") end Explicação: Essa função converte o tempo (especificado em um vetor que será o argumento da função) sempre para segundos. O primeiro elemento do vetor deve ser um número e o segundo a unidade de tempo. As unidades de tempo aceitáveis são: "sec" - segundo(s) "min" - minuto(s) "hour" - hora(s) "day" - dia(s) Exemplo: local tempo = {2, "min"} print(mathtime(tempo)) -- valor retornado: 120 getStrTime function getStrTime(table) -- by dwarfer local unit = {["sec"] = "second",["min"] = "minute",["hour"] = "hour",["day"] = "day"} return tostring(table[1].." "..unit[table[2]]..(table[1] > 1 and "s" or "")) end Explicação: Essa função bem simples é basicamente para converter o tempo especificado em texto (em inglês) como um complemento à função mathtime. Exemplo: local tempo = {3, "hour"} print(getStrTime(tempo)) -- valor retornado: 3 hours Um exemplo simples e prático de um script utilizando ambas as funções acima e que envia uma mensagem depois de determinado tempo do player ter clicado em um item é demonstrado abaixo: local tempo_para_receber_msg = {3, "min"} function onUse(cid, item, fromPosition, itemEx, toPosition) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You will receive the surprise message in "..getStrTime(tempo_para_receber_msg)..".") addEvent(function() if isPlayer(cid) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Tibia King: All about Tibia, bots and Ot servers!") end end, mathtime(tempo_para_receber_msg) * 1000) return true end Quem quiser ver para crer é só testar!
  11. Não deveria nem me dar o trabalho de responder. Na data do tópico eu estava disposto a fazer o script para disponibilizar para todos, como sempre faço, (você pode conferir as datas, caso queira), mas como o autor do pedido não me respondeu corretamente, nem tendo a preocupação de correr atrás do mínimo para que conseguisse o sistema, e não respondeu com educação a outras pessoas no tópico, achei que ele não merecia e não fiz (o que é uma opção minha, correto?).
  12. Ou seja, é exatamente o que você quer. Dê-se o trabalho de pelo menos ler o tópico.
  13. Caso seja tfs 0.4: Em talkactions/scripts crie um arquivo.lua: local quests = { ["demon"] = { min_level = 10, enter_pos = {x = 1, y = 1, z = 1}, area = {fromPos = {x = 1, y = 1, z = 1}, toPos = {x = 1, y = 1, z = 1}}, time_to_finish = {10, "min"}, time_to_make_again = {1, "hour"} }, ["dragon"] = { min_level = 10, enter_pos = {x = 1, y = 1, z = 1}, area = {fromPos = {x = 1, y = 1, z = 1}, toPos = {x = 1, y = 1, z = 1}}, time_to_finish = {10, "min"}, time_to_make_again = {1, "hour"} } } local time_storage = 87870 -- só modifique se necessário function onSay(cid, words, param, channel) local param, p, check = param:lower(), getPlayerPosition(cid), false if not param or param == "" then local str, n = '~~ [Available Quests] ~~\n\n', 1 for quest, info in pairs(quests) do str = str .. n .. " - " .. Fupper(quest) .. " (Level: "..info.min_level..")\n" n = n + 1 end doShowTextDialog(cid, 1955, str) return true end local t = quests[param] if not t then return doPlayerSendCancel(cid, "Quest not found.") end if getPlayerLevel(cid) < t.min_level then return doPlayerSendCancel(cid, "Only players level "..t.min_level.." or higher can go the "..param.." quest.") end if isInRange(p, t.area.fromPos, t.area.toPos) then return doPlayerSendCancel(cid, "You are already inside the "..param.." quest area.") end for quest, info in pairs(quests) do if isInRange(p, info.area.fromPos, info.area.toPos) then check = true end end if check then return doPlayerSendCancel(cid, "You cannot go to another quest inside a quest.") end local stor = getPlayerStorageValue(cid, time_storage) if stor > os.time() then return doPlayerSendCancel(cid, "You can go to a quest again at "..os.date("%d %B %Y %X", stor)..".") end doSendMagicEffect(p, CONST_ME_POFF) local destination = t.enter_pos doTeleportThing(cid, destination) doSendMagicEffect(destination, CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Good luck in "..param.." quest! You have "..getStrTime(t.time_to_finish).." to finish or you will be kicked.") setPlayerStorageValue(cid, time_storage, mathtime(t.time_to_make_again) + os.time()) addEvent(function() if isPlayer(cid) then if isInRange(getPlayerPosition(cid), t.area.fromPos, t.area.toPos) then doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) local temple = getTownTemplePosition(getPlayerTown(cid)) doTeleportThing(cid, temple) doSendMagicEffect(temple, CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Your time is over!") end end end, mathtime(t.time_to_finish) * 1000) return true end function mathtime(table) -- by dwarfer local unit = {"sec", "min", "hour", "day"} for i, v in pairs(unit) do if v == table[2] then return table[1]*(60^(v == unit[4] and 2 or i-1))*(v == unit[4] and 24 or 1) end end return error("Bad declaration in mathtime function.") end function getStrTime(table) -- by dwarfer local unit = {["sec"] = "second",["min"] = "minute",["hour"] = "hour",["day"] = "day"} return tostring(table[1].." "..unit[table[2]]..(table[1] > 1 and "s" or "")) end function Fupper(str) return (str:gsub("^%l", string.upper)) end Em talkactions.xml, adicione a tag: <talkaction words="!quest" event="script" value="NOMEDOARQUIVO.lua"/> Configuração: ["demon"] = { -- nome da quest min_level = 10, -- level mínimo para ir para a quest enter_pos = {x = 1, y = 1, z = 1}, -- posição de entrada na quest area = { fromPos = {x = 1, y = 1, z = 1}, -- posição do canto superior esquerdo da área toPos = {x = 1, y = 1, z = 1} -- posição do canto inferior direito da área }, time_to_finish = {10, "min"}, -- tempo que o player terá para finalizar a quest ("sec", "min", "hour", "day") time_to_make_again = {1, "hour"} -- tempo para poder fazer uma quest novamente }, Utilização: !quest -> mostra as quests disponíveis !quest nome da quest -> leva o player para a quest Ex.: !quest demon
  14. Utilizando a ferramenta de busca do fórum, encontrei esse tópico que é o que você precisa: Script do piso de acesso ao local: Em movements/scripts crie um arquivo.lua e cole isto dentro: function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) domodlib('KillM_func') if tonumber(getPlayerStorageValue(cid, tsk.storages[1])) then doTeleportThing(cid, fromPosition, true) doPlayerSendCancel(cid, "Você não tem acesso a esse local.") end return true end No movements.xml, adicione a tag: <movevent type="StepIn" actionid="XXXX" event="script" value="NOMEDOARQUIVO.lua"/> Edite 'XXXX' para o actionid do piso, além do nome do arquivo.
  15. function onSay(cid, words, param) local storage = 9999 -- mão mexa local itemid = 2145 -- id do item que vai remover local count = 10 -- quantidade do item que vai remover local looktype = 2192 -- O Looktype da outift que vai ser vendida if getPlayerStorageValue(cid, storage) >= 1 then doPlayerSendTextMessage(cid, 22, "Desculpe voce ja comprou essa outift") return true end if not doPlayerRemoveItem(cid,itemid,count) then doPlayerSendTextMessage(cid, 22, "Você não tem dinheiro suficiente") return true end doPlayerAddOutfit(cid,looktype,3) setPlayerStorageValue(cid, storage, 1) doPlayerSendTextMessage(cid, 22, "Você comprou a outift") return true end
  16. Fiz um mod aqui, teste-o: Configuração: JAIL_SYS = { block_mana = true, -- 'true' para bloquear ganho de mana, 'false' para não bloquear prision_area = { -- área da prisão fromPos = {x = 1, y = 1, z = 6}, -- posição do canto superior esquerdo (caso a prisão possua andares diferentes, aqui é o de menor 'z') toPos = {x = 2, y = 2, z = 7} -- posição do canto inferior direito da área (caso a prisão possua andares diferentes, aqui é o de maior 'z') }, max_security_skulls = {SKULL_RED, SKULL_BLACK}, -- caso o player tenha essas skulls, irão para as 'celas de segurança máxima' jails_enter_positions = { ["NORMAL"] = { -- posições das celas normais [1] = {x = 1, y = 1, z = 1}, [2] = {x = 1, y = 1, z = 1}, [3] = {x = 1, y = 1, z = 1}, }, ["MAX_SECURITY"] = { -- posições das celas de segurança máxima [1] = {x = 1, y = 1, z = 1}, [2] = {x = 1, y = 1, z = 1}, [3] = {x = 1, y = 1, z = 1}, }, }, storages = {jailtime = 76530} -- só modifique se necessário } Na linha: <globalevent name="JailBlockMana" interval="10000" event="script"><![CDATA[ Edite o 10000 (10 segundos) para o intervalo de tempo que todos da prisão terão a mana igual a 0. Para utilizar o comando: !jail Nome do player,tempo preso em minutos,levels perdidos Ex.: !jail Dwarfer,2,1 <- Preso por 2 minutos e perderá 1 level
  17. Provavelmente está no globalevents, mas envie o restante dos arquivos.
  18. Edite a unidade do tempo nessa linha como desejar: local unit = "min" -- "sec", "min", "hour", "day"
  19. Dwarfer postou uma resposta no tópico em Suporte Tibia OTServer
  20. Dwarfer postou uma resposta no tópico em Suporte Tibia OTServer
    local t = { time = 15, -- em segundos points = 70, -- aumento do skill storage = 15288, -- só modifique se necessário waittime = 60, -- em segundos tile = { [1] = {x=1509, y=1260, z=7}, -- posição do player [2] = {x=1509, y=1256, z=7} -- posição do alvo }, not_allowed_areas = { -- áreas não permitidas para soltar a magia [1] = {{x=1509, y=1259, z=7},{x=1509, y=1255, z=7}}, -- from, to [2] = {{x=979, y=911, z=7}, {x=994, y=918, z=7}}, [3] = {{x=1514, y=1262, z=7}, {x=1504, y=1253, z=7}}, [4] = {{x=1552, y=1254, z=7}, {x=1561, y=1262, z=7}}, [5] = {{x=979, y=911, z=7}, {x=994, y=918, z=7}}, [6] = {{x=1156, y=1192, z=7}, {x=1172, y=1172, z=7}}, [7] = {{x=664, y=1096, z=7}, {x=685, y=1104, z=7}}, [8] = {{x=1553, y=1254, z=7}, {x=1562, y=1262, z=7}}, [9] = {{x=1133, y=1039, z=12}, {x=972, y=873, z=12}}, [10] = {{x=1133, y=1039, z=11}, {x=972, y=873, z=11}}, [11] = {{x=1133, y=1039, z=10}, {x=972, y=873, z=10}} } } local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, t.time*1000) setConditionParam(condition, CONDITION_PARAM_STAT_MAGICLEVEL, t.points) setConditionParam(condition, CONDITION_PARAM_SKILL_FIST, t.points) setConditionParam(condition, CONDITION_PARAM_SKILL_SWORD, t.points) setConditionParam(condition, CONDITION_PARAM_SKILL_AXE, t.points) setConditionParam(condition, CONDITION_PARAM_SKILL_CLUB, t.points) setConditionParam(condition, CONDITION_PARAM_SKILL_DISTANCE, t.points) setConditionParam(condition, CONDITION_PARAM_SKILL_SHIELD, t.points) function onCastSpell(cid, var) if exhaustion.check(cid, t.storage) then doPlayerSendCancel(cid, "Você precisa esperar "..exhaustion.get(cid, t.storage).. " segundos para usar novamente!") return false end local p, check = getCreaturePosition(cid), true for _, area in pairs(t.not_allowed_areas) do if isInRange(p, area[1], area[2]) then check = false break end end if not check then doPlayerSendCancel(cid, "Você nao pode usar o Tsukuyomi World aqui!") return false end local target = getCreatureTarget(cid) if not isPlayer(target) then doPlayerSendCancel(cid, "Você so pode usar essa magia em players!") return false end local targetPos = getCreaturePosition(target) exhaustion.set(cid, t.storage, t.waittime) doAddCondition(cid, condition) doCreatureSetNoMove(target, true) doTeleportThing(cid, t.tile[1]) doTeleportThing(target, t.tile[2]) doSendMagicEffect(targetPos, CONST_ME_POFF) addEvent(function() if isPlayer(cid) then doTeleportThing(cid, p) end if isPlayer(target) then doTeleportThing(target, targetPos) doCreatureSetNoMove(target, false) end end, t.time * 1000) return true end
  21. Dwarfer postou uma resposta no tópico em Suporte Tibia OTServer
    local t = { not_allowed_areas = { [1] = {from = {x = 941, y = 617, z = 7}, to = {x = 965, y = 640, z = 7}}, -- começo e final do mapa [2] = {from = {x = 979, y = 901, z = 7}, to = {x = 991, y = 905, z = 7}} }, max_summons = 4, monster = "Corvo", effect_on_appear = 111 } function onCastSpell(cid, var) local check = true for _, area in pairs(t.not_allowed_areas) do if isInRange(getCreaturePosition(cid), area.from, area.to) then check = false break end end if not check then doPlayerSendCancel(cid, "Você não pode usar summons aqui!") return true end if #getCreatureSummons(cid) >= t.max_summons then doPlayerSendCancel(cid, "Máximo número de clones atingido!") return true end local p, sum, out = getCreaturePosition(cid), #getCreatureSummons(cid), getCreatureOutfit(cid) repeat local clone = doCreateMonster(t.monster, {x = p.x + math.random(-1,1), y = p.y + math.random(-1,1), z = p.z}, false, true) if clone then local clone_out = getCreatureOutfit(clone) clone_out.lookType = out.lookType doSetCreatureOutfit(clone, clone_out, -1) doSendMagicEffect(getCreaturePosition(clone), t.effect_on_appear) doConvinceCreature(cid, clone) sum = sum + 1 end until (sum == t.max_summons) return true end

Informação Importante

Confirmação de Termo