Ir para conteúdo

Garou

Membro
  • Registro em

  • Última visita

Tudo que Garou postou

  1. Obrigado pela observação. Estou um pouco mais bêbado que geralmente estou hoje
  2. local fromSqm = {x = 886, y = 965, z = 7} -- Coordenadas do canto superior esquerdo da sala local toSqm = {x = 888, y = 968, z = 7} -- Coordenadas do canto inferior direito da sala local destination = {x = 887, y = 968, z = 7} -- Coordenadas para onde o jogador será teleportado local doorID = 5105 -- ID da porta function onUse(cid, item, fromPosition, itemEx, toPosition) local width = (math.max(fromSqm.x, toSqm.x) - math.min(fromSqm.x, toSqm.x)) / 2 + 1 local height = (math.max(fromSqm.y, toSqm.y) - math.min(fromSqm.y, toSqm.y)) / 2 + 1 local center = {x = math.min(fromSqm.x, toSqm.x) + width, y = math.min(fromSqm.y, toSqm.y) + height, z = fromSqm.z} if itemEx.itemid == doorID then if #getSpectators(center, width, height, false) >= 2 then doPlayerSendCancel(cid, "Espere o outro usuário sair da sala") else doTeleportThing(cid, destination) end else doPlayerSendCancel(cid, "Este item não deve ser usado nessa porta") end return true end
  3. Hey, caras. Estava vendo aqui a função getSpectators(centerPos, width, height) e percebi que seu uso é até um pouco complicado. Então desenvolvi uma função Lua que pega as criaturas de uma certa área, onde você só precisa fornecer as coordenadas do canto superior esquerdo e do canto inferior direito. function getSpectatorsFromArea(fromPosition, toPosition) local width = (math.max(fromPosition.x, toPosition.x) - math.min(fromPosition.x, toPosition.x)) / 2 + 1 local height = (math.max(fromPosition.y, toPosition.y) - math.min(fromPosition.y, toPosition.y)) / 2 + 1 local center = {x = math.min(fromPosition.x, toPosition.x) + width, y = math.min(fromPosition.y, toPosition.y) + height, z = fromPosition.z} return getSpectators(center, width, height, false) end Espero que seja útil na composição de seus scripts, Abração. \o
  4. local fromSqm = {x = 0, y = 0, z = 0} -- Coordenadas do canto superior esquerdo da sala local toSqm = {x = 0, y = 0, z = 0} -- Coordenadas do canto inferior direito da sala local destination = {x = 0, y = 0, z = 0} -- Coordenadas para onde o jogador será teleportado local doorID = 0 -- ID da porta function onUse(cid, item, fromPosition, itemEx, toPosition) local width = (math.max(fromSqm.x, toSqm.x) - math.min(fromSqm.x, toSqm.x)) / 2 + 1 local height = (math.max(fromSqm.y, toSqm.y) - math.min(fromSqm.y, toSqm.y)) / 2 + 1 local center = {x = math.min(fromSqm.x, toSqm.x) + width, y = math.min(fromSqm.y, toSqm.y) + height, z = fromSqm.z} if itemEx.itemid == doorID then if #getSpectators(center, width, height, false) >= 1 then doPlayerSendCancel(cid, "Desculpe, já há alguém na sala") end else doPlayerSendCancel(cid, "Este item não deve ser usado nessa porta") end return true end <action itemid="itemid" event="script" value="nome do script.lua"/> Coloca o id do item que será usado na porta, e o nome do arquivo .lua que será criado na pasta data/actions/scripts. As variáveis que você deve configurar já estão todas comentadas.
  5. Garou postou uma resposta no tópico em Playground (Off-topic)
    print("Seja welcomido")
  6. Me passa o script que o cara usa o item na porta e é teleportado para dentro que eu faço para você
  7. Você cometeu um erro ali, no caso, o npchandler.lua era para ficar assim: -- Returns true if cid is within the talkRadius of this npc. function NpcHandler:isInRange(cid) local distance = getDistanceTo(cid) or -1 if(distance == -1) then return false end return (distance <= self.talkRadius) end function NpcHandler:setRadius(value) self.talkRadius = value end E não esqueça de dar /reload npcs ou abrir e fechar o executável do seu servidor
  8. Fiz uma tentativa aqui e não testei, logo não sei se vai funcionar. Abra o arquivo npchandler.lua em data/npc/lib/npcsystem e procure por: function NpcHandler:isInRange(cid) local distance = getNpcDistanceTo(cid) or -1 return distance ~= -1 and distance <= self.talkRadius end Embaixo, adicione: function NpcHandler:setRadius(value) self.talkRadius = value end No NPC, procure por isso: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) Logo abaixo adicione: npcHandler:setRadius(1) Bom teste
  9. Olá, Adriano SwaTT Abra o arquivo npchandler.lua em data/npc/lib/npcsystem e procure por essa linha: talkRadius = 3, Mude o valor para qual você deseja.
  10. Muito bom, garotão. Aprendeu tudo com o papai Espero que você encontre um bom projeto para trabalhar.
  11. Vídeo de funcionamento do sistema adicionado ao tópico. Brigadão, CéuPerigoso \o
  12. Ótimo trabalho, Godfather. Tomei a liberdade de me basear em seu código e criei uma versão em spell, que consome certa mana para ser invocada e certa mana a cada efeito lançado no mapa. A magia para automaticamente quando encontra um monstro, quando se distancia muito do jogador, quando entra em Protection Zone ou quando a mana acaba. Ela também randomiza o elemento lançado. [paste]NASVsYW8[/paste] <instant name="avatar" words="avatar" lvl="200" mana="100" prem="1" selftarget="1" exhaustion="2000" needlearn="0" event="script" value="avatar.lua"/> Reputação+
  13. Realmente os jogos da Gameloft para Android são muito fodas. Meu irmão tem um Xperia Play, fiquei com o Milestone 3 por causa do teclado físico
  14. Garou postou uma resposta no tópico em Suporte Tibia OTServer
    Esse tipo de informação fica no arquivo talkactions.xml localizado em data\talkactions Os scripts podem ser criados na pasta data\talkactions\scripts. E essa função "dar" não existe nas sources.
  15. Garou postou uma resposta no tópico em Playground (Off-topic)
    Ele foi chamado pelo negro dragão para moderar seção de bots do "Vale-Tudo Brasil" Aliás, seção de bots naquele fórum lá é cópia daqui, né?
  16. A única coisa ruim do Android é não possuir a variedade de jogos e aplicativos dos aparelhos com iOS
  17. O meu era o Milestone 2, agora possuo o Milestone 3
  18. Olá, Calvin. Este conteúdo já existe e foi disponibilizado em [Action] Controlled Attack. Abraços
  19. Garou postou uma resposta no tópico em Scripts tfs 0.4 (OLD)
    Legal, SkyDangerous. É um NPC simples, mas muito útil. Algumas observações: for i = 1, table.maxn(items) do doPlayerAddItem(cid, item[i], 1) doPlayerAddItem(cid, 2554, 1) doPlayerAddItem(cid, 2120, 1) doPlayerAddItem(cid, 2160, 2) end doPlayerAddItem(cid, item[i], 1) Você declarou a tabela com o nome items e nessa linha chama a tabela item que não existe doPlayerAddItem(cid, 2554, 1) doPlayerAddItem(cid, 2120, 1) doPlayerAddItem(cid, 2160, 2) E incluiu essas três linhas dentro do for, o que faz com que a função seja executada n vezes igual o tamanho da tabela. Ou seja, o jogador iria receber 8 crystal coins e não 2 apenas. E a função table.maxn pode ser chamada por # for i = 1, #tables do (...) end
  20. Garou postou uma resposta no tópico em Playground (Off-topic)
    Eaê LOTRO Boy! Seja welcomido!
  21. ADVANCED FORGE SYSTEM O SISTEMA DE CRIAÇÃO DE ITENS PARA SEU SERVIDOR Creio que muitos já conhecem o sistema de forja criado por mim, acontece que o código já estava um pouco obsoleto, então resolvi reescrever ele do 0. Simplesmente consiste em um sistema de criação de itens avançado que ressuscita um pouco do RPG perdido nos servidores de hoje em dia. O jogador poderá criar itens através de forja, agindo como um verdadeiro ferreiro medieval. Adiciona itens em cima de uma bigorna previamente colocada no mapa e com um martelo cria um item totalmente novo. CARACTERÍSTICAS DA VERSÃO FINAL: - Configuração intuitiva e fácil de compreender; - Mini-tutorial auxiliando criação de novas receitas; - Receitas podem conter até 250 itens diferentes com suas respectivas quantidades; - Sistema inteligente que identifica uma receita em qualquer ordem; - Código totalmente orientado a objetos; - Possibilidade de configurar diferentes requerimentos, diferentes skills, magic level e level Há dois modos de instalar o Advanced Forge System, o primeiro é seguir os passos deste tópico e o segundo e baixar pasta data/ anexada no tópico com os arquivos em seus respectivos diretórios, precisando apenas o registro das chaves nos arquivos XML. Escolha o modo que mais convém a você. Crie um arquivo em data/lib chamado forgesystem.lua e cole o conteúdo abaixo: --[[ ADVANCED FORGE SYSTEM FINAL Criado por Oneshot É proibido a venda ou a cópia sem os devidos créditos desse script. ]]-- RecipeHandler = { itemtype = 0, items = {}, level = 1, maglevel = 0, skills = {[0] = 0, [1] = 0, [2] = 0, [3] = 0, [4] = 0, [5] = 0, [6] = 0} } Forge = { type = nil, position = nil, magicEffect = CONST_ME_MAGIC_GREEN, messages = { class = MESSAGE_STATUS_DEFAULT, success = "You have successfully forged a %s.", needskill = "You don't have enough %s to create a %s.", needlevel = "You need level %s to create a %s.", needmaglevel = "You need magic level %s to create a %s." } } function RecipeHandler:new(itemtype, items, level, maglevel, skills) local obj = { itemtype = (itemtype or 0), items = (items or {}), level = (level or 1), maglevel = (maglevel or 0), skills = (skills or {[0] = 0, [1] = 0, [2] = 0, [3] = 0, [4] = 0, [5] = 0, [6] = 0}) } table.insert(Recipes, obj) return setmetatable(obj, {__index = self}) end function RecipeHandler:setItem(itemtype) self.itemtype = (itemtype or 0) end function RecipeHandler:setRecipe(...) self.items = {...} end function RecipeHandler:setRecipeItem(itemid, amount) table.insert(self.items, {itemid, amount}) end function RecipeHandler:setSkill(skillid, value) self.skills[skillid] = value end function RecipeHandler:setLevel(value) self.level = value end function RecipeHandler:setMagLevel(value) self.maglevel = value end function RecipeHandler:check(position) local match = false for n, item in ipairs(self.items) do local thing = getTileItemById(position, item[1]) if thing.uid > 0 and math.max(1, thing.type) >= item[2] then if n == #self.items then match = true end else break end end return match end function RecipeHandler:get(position) if self:check(position) == true then return setmetatable({type = self, position = position}, {__index = Forge}) end return false end function Forge:create(cid) if self.type.itemid == 0 then print("[FORGE SYSTEM - ERROR] ATTEMPT TO CREATE A RECIPE ITEMID 0") return end local status = true if(cid) then if getPlayerLevel(cid) < self.type.level then doPlayerSendTextMessage(cid, self.messages.class, self.messages.needlevel:format(self.type.level, getItemNameById(self.type.itemtype))) return end if getPlayerMagLevel(cid) < self.type.maglevel then doPlayerSendTextMessage(cid, self.messages.class, self.messages.needmaglevel:format(self.type.maglevel, getItemNameById(self.type.itemtype))) return end for skillid, value in pairs(self.type.skills) do if getPlayerSkillLevel(cid, skillid) < value then status = false doPlayerSendTextMessage(cid, self.messages.class, self.messages.needskill:format(SKILL_NAMES[skillid], getItemNameById(self.type.itemtype))) break end end end if status == true then for _, item in ipairs(self.type.items) do local thing = getTileItemById(self.position, item[1]) doRemoveItem(thing.uid, item[2]) end doSendMagicEffect(self.position, self.magicEffect) doPlayerSendTextMessage(cid, self.messages.class, self.messages.success:format(getItemNameById(self.type.itemtype))) doCreateItem(self.type.itemtype, self.position) end end dofile(getDataDir() .."/lib/recipes.lua") Crie um arquivo em data/lib chamado recipes.lua e adicione o conteúdo abaixo: ---------------------------------------- -----** TUTORIAL DE CONFIGURAÇÃO **----- ---------------------------------------- --[[ O 'ADVANCED FORGE SYSTEM' é muito fácil e intuitivo de configurar, você só precisa chamar a função RecipeHandler:new(...), sendo que você já configurar os atributos da receita nela ou usar outras funções para isso. Por exemplo, quero criar uma Magic Sword que precise de 100 Gold Nuggets. RecipeHandler:new(2400, {{2157, 100}}) Ou então Magic_Sword = RecipeHandler:new() Magic_Sword:setItem(2400) Magic_Sword:setRecipe({2157, 100}) Funções do Sistema: RecipeHandler:new(itemtype, items, level, maglevel, skills) --> Cria uma nova instância de forja. RecipeHandler:setItem(itemtype) --> Atribui um certo itemid como resultado da receita. RecipeHandler:setRecipe(recipe) --> Atribui uma receita. RecipeHandler:setRecipeItem(itemid, amount) --> Adiciona um itemid e sua quantidade a receita. RecipeHandler:setSkill(skillid, value) --> Atribui um valor necessário de uma certa skill para poder criar a receita. RecipeHandler:setLevel(value) --> Atribui o level necessário para criar uma receita. RecipeHandler:setMagLevel(value) --> Atribui o magic level necessário para criar uma receita. ]]-- --[[ Este é um exemplo de receita usando algumas funções. É uma Magic Sword (ITEMID: 2400) que precisa de 100 Gold Nuggets (ITEMID: 2157), além disso, o personagem que tentar forjar, precisa ter Level 100 e Sword Fighting 50. ]]-- Recipes = {} magicsword = RecipeHandler:new() magicsword:setItem(2400) magicsword:setRecipeItem(2157, 100) magicsword:setLevel(100) magicsword:setSkill(2, 50) Agora em data/actions/scripts, crie um arquivo chamado iron_hammer.lua e adicione o conteúdo abaixo: function onUse(cid, item, fromPosition, itemEx, toPosition) local recipe = nil for _, v in ipairs(Recipes) do recipe = v:get(toPosition) if(recipe ~= false) then break end end if(recipe) then recipe:create(cid) else doPlayerSendCancel(cid, "This is not a valid recipe.") end return true end E por fim em actions.xml, adicione a seguinte linha: <action itemid="4846" event="script" value="iron_hammer.lua"/> OPCIONAL - TALKACTION A talkaction abaixo mostra ao jogadoras receitas configuradas no servidor que ele pode fazer. Em data/talkactions/scripts, crie um arquivo chamado recipes.lua e adicione o conteúdo abaixo: function onSay(cid, words, param, channel) local ret = {} local msg = " ADVANCED FORGE SYSTEM\n" for _, recipe in ipairs(Recipes) do local skills = true for skillid, value in pairs(recipe.skills) do if getPlayerSkillLevel(cid, skillid) < value then skills = false break end end if skills == true then if getPlayerLevel(cid) >= recipe.level and getPlayerMagLevel(cid) >= recipe.maglevel then table.insert(ret, {recipe, true}) else table.insert(ret, {recipe, false}) end else table.insert(ret, {recipe, false}) end end for _, recipe in ipairs(ret) do msg = msg .."\nRecipe for ".. getItemNameById(recipe[1].itemtype) ..":\n\n" if recipe[2] == true then for _, item in ipairs(recipe[1].items) do msg = msg .."* ".. getItemNameById(item[1]) .." [".. math.min(item[2], math.max(0, getPlayerItemCount(cid, item[1]))) .."/".. item[2] .."]\n" end else msg = msg .."[LOCKED]\n" end end doShowTextDialog(cid, 2555, msg) return true end Em data/talkactions/talkactions.xml, adicione a linha: <talkaction words="/recipes" event="script" value="recipes.lua"/> Siga as instruções para configuração de novas receitas. Em breve vídeo de funcionamento Advanced Forge System.rar
  22. Na verdade o comando !buyhouse já engloba o sistema de aluguel (pois ele é configurado nas sources), não é necessária a criação de uma outra talkaction para isso.
  23. Olá, Alberess Basta a configuração de alguns parâmetros no arquivo config.lua: houseRentAsPrice = true -- O preço das casas deve ser o aluguel? housePriceAsRent = false -- O preço do aluguel deve ser o preço da casa? housePriceEachSquare = 1000 -- Preço por cada sqm da casa houseRentPeriod = "monthly" -- Período de cobrança do aluguel. No exemplo acima, configurei para o jogador pagar o preço de aluguel para comprar a casa e o período de aluguel como "monthly", ou seja, um período mensal. Os valores para o parâmetro houseRentPeriod são: houseRentPeriod Values: yearly, monthly, weekly, daily, never -- Anual, Mensal, Semanal, Diário, Nunca Lembrando que o aluguel deve ser configurado diretamente no mapa. Abraços
  24. Bem legal, cara. Há duas linhas no script que me intrigam bastante: doPlayerSetExperienceRate(cid, getConfigValue("rateExperience")*2) doPlayerSetExperienceRate(cid, 1) Essa é a função doPlayerSetExperience(cid, value) encontrada no arquivo 050-functions.lua: function doPlayerSetExperienceRate(cid, value) return doPlayerSetRate(cid, SKILL__LEVEL, value) end Logo a segunda linha irá atribuir uma rate de experiência igual a 1x quando o anel for desequipado?
  25. Gostei do código, obrigado pela contribuição. +1 ponto de reputação.

Informação Importante

Confirmação de Termo