Ir para conteúdo

Oneshot

Marquês
  • Total de itens

    1347
  • Registro em

  • Última visita

  • Dias Ganhos

    36

Tudo que Oneshot postou

  1. Quando disse uniqueid não me referia 'literalmente'. Eu precisaria dar uma olhada na estrutura das tabelas do Shop System do Gesior para desenvolver esse script que você precisa, então se você puder postar o DDL¹ delas ou uma screenshot mesmo, ficaria grato. ¹ - Normalmente é a query para criar toda uma tabela. Att.
  2. Não existe uma função que retire levels do jogador. Acho que dá até para fazer com querys na database, mas aí teria que ficar kickando o jogador se ele matasse um multiclient dele.
  3. Se você usa Modern AAC ou Gesior, o sistema de shop deles cria um tipo de uniqueid para produtos comprados registrados no nome de uma pessoa. Para fazer o que você quer, é muito simples. - Crie uma talkaction, action, globalevent, o que você quiser. - Faça uma verificação profunda em todos os jogadores online. - Retorne uma tabela com itens VIP de cada jogador. - Verifique esses itens VIP e encontre itens que não estão registrados no nome do jogador em questão.
  4. Quantos tutoriais de tabelas, if, elseif e else. Pô galerinha criem uns tutoriais de loops, luasql, metatabelas, manipulação de strings, co-rotinas... tem tanta coisa legal em Lua
  5. Parei de ler no primeiro ç em você. Boa entrevista, ui ui, estou no topo da lista dos mentores. Brigadão, Vodkart.
  6. E há algumas dessas empresas que além de vender conteúdo Open Source, se apoderam de scripts que existem em fóruns internacionais como OTLand e comercializam como se fossem de sua autoria. Me dói a alma ver o número de empresas que comercializam o sistema do evento Zombie.
  7. Revisão Só há uma coisa que define esse servidor, o advérbio Incrivelmente. Porque este servidor é incrivelmente mal planejado com um mapa incrivelmente sem noção (afinal quem já viu Ghazbarans a 20 sqm. do templo principal?), com scripts apresentando um monte de problemas (Consigo GOD em qualquer servidor usando esse mapa com o comando /changename) e sem contar a quantidade extensa de bugs, como 'Duplicate uniqueid' (Vários desse tipo). Aah, mais uma coisa, quem quer criar um servidor com essa base, vai passar vergonha pois além dos inúmeros itens customizados mal equilibrados, o amigo Subwat deixou presentinhos como: gay helmet, sexo oral armor e botas de viadinho. Prós - Um mapa extremamente editado; - Base para muitos dos servidores high-rate. Contras - Muitos bugs; - Falhas de segurança; - Por não ter nenhum sentido, o mapa editado do servidor não deixa de ser ruim. (Apocalypses logo abaixo da cidade? Ãh?); - Vocações desequilibradas, itens editados desequilibrados; - O arquivo vocations.xml possui um monte de vocações que nem sequer são usadas; - As pastas de scripts, como actions e spells, possuem um monte de arquivos que não são usados Att.
  8. Apoiado, tô precisando aprender scripting. Conhecimento nunca é demais Att.
  9. Servidores 9.x não possuem mais essa função. Parece que textos animados foram retirados do Tibia depois do grande update
  10. Contribuição bem legal para os donos de servidores sem site que além de tudo pensam em lucrar com Open Tibia. Mas, como relatado aqui, o código do NPC do tal LucasOlzon está muito simplista e adicionar mais de cinco itens diferentes já tornaria o código em um amontoado maçante e macarrônico. Ele poderia ter usado muito bem tabelas para simplificar o código e apenas uma sintaxe relacionando a tabela. Não tiro os créditos pela funcionalidade, mas o código não está bom e eu como scripter não posso simplesmente sorrir e falar "Ai que lindo amiguh, tá muito daora rep+"
  11. Deu para entender sua mensagem agora. Obrigado. Sobre o tópico, não tenho interesse justamente por ser um estágio. Já fui moderador de três fóruns brasileiros de Open Tibia e sei como funciona um estágio, é como se ele nunca acabasse. Sem contar que entrar como estagiário para virar colaborador e só depois moderador, caraca, não posso investir tanto do meu tempo para esse ciclo. Boa sorte aos inscritos, façam dessa comunidade o melhor.
  12. arithmetical = { progression = function(omega, ratio, amount) local ret = {} local new = omega for j = 1, amount do table.insert(ret, new) new = new + ratio end return ret end } Acho que fazendo isso com o código acima: arithmetical.progression(1, 2, 2) Retornará {1, 3}
  13. A verdade é que vocês todos são fracos. math.pow(x, y) FLW
  14. O comando for tem três parâmetros: ínicio, fim e incremento. Sendo assim, dá para deixar o código da função bem mais limpo sem declaração de um monte de variáveis. function getFactorial(number) local value = number for new = (number - 1), 1, -1 do value = value * new end return value end Um abraço do seu amiguinho, UmTiro
  15. Um tutorial na forma de Frequently Asked Questions (FAQ). Gostei, Céu Perigoso
  16. Puta que pariu hein, você se faz de burro, né? local storage = 6666 function getTournamentPlayers() local ret = {} for _, cid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(cid, storage) == 1 then table.insert(ret, cid) end end return ret end Ai na buceta do seu NPC, tu coloca lá na porra do código hi join -- setPlayerStorageValue(cid, 6666, 1)
  17. Opa legal. function blabla(itemid, count, position) return doRemoveItem(getTileItemById(position, itemid).uid, (count or 1)) and true or false end flw
  18. Manual de Referência de Lua 5.1 - índice Deleite-se
  19. O erro não está no script, mas no banco de dados do servidor. Abra seu banco de dados com um gerenciador de Sqlite, e execute a seguinte query: ALTER TABLE `players` ADD `resets` INTEGER NOT NULL DEFAULT 0 Flw
  20. function getCombatFormula(cid, level) local min = level * 10 local max = level * 20 return -min, -max end setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "getCombatFormula")
  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. FAALA AÊ, ÉKS Recebi recentemente um pedido de um membro para criar uma action que, normalmente, não vem com os servidores - o mecanismo de criar rum do Tibia. Criei alguns scripts simples e editei alguns, tornando possível o funcionamento do sistema. data/actions/scripts Na pasta tools, crie um arquivo com nome sickle.lua, adicionando o conteúdo abaixo: function onUse(cid, item, fromPosition, itemEx, toPosition) if(itemEx.itemid == 5471) then doTransformItem(itemEx.uid, 5463) doCreateItem(5467, 1, toPosition) doDecayItem(itemEx.uid) return true end return destroyItem(cid, itemEx, toPosition) end Ainda na pasta tools, crie um arquivo com nome firebug.lua, adicionando o conteúdo abaixo: function onUse(cid, item, fromPosition, itemEx, toPosition) if(itemEx.itemid == 5466) then doSendMagicEffect(toPosition, CONST_ME_HITBYFIRE) doTransformItem(itemEx.uid, 5465) doRemoveItem(item.uid, 1) doDecayItem(itemEx.uid) return true end end Na pasta other, crie um arquivo com nome bunch of sugar cane.lua e adicione o conteúdo abaixo: local ITEM_IDS = { [5469] = 5513, [5470] = 5514 } function onUse(cid, item, fromPosition, itemEx, toPosition) if(itemEx.itemid == 5469 or itemEx.itemid == 5470) then doSendMagicEffect(toPosition, CONST_ME_BLOCKHIT) doTransformItem(itemEx.uid, ITEM_IDS[itemEx.itemid]) doRemoveItem(item.uid, 1) doDecayItem(itemEx.uid) return true elseif itemEx.itemid == 5513 or itemEx.itemid == 5514 then return doPlayerSendCancel(cid, "This machine is processing a bunch already.") end end E na pasta liquid, abra o arquivo containers.lua e substitua todo conteúdo por este: local DISTILLERY_ON = {5513, 5514} local DISTILLERY_OFF = {5469, 5470} local ITEM_RUM_FLASK = 5553 local ITEM_POOL = 2016 local TYPE_EMPTY = 0 local TYPE_WATER = 1 local TYPE_BLOOD = 2 local TYPE_BEER = 3 local TYPE_SLIME = 4 local TYPE_MANA_FLUID = 7 local TYPE_LIFE_FLUID = 10 local TYPE_OIL = 11 local TYPE_WINE = 15 local TYPE_MUD = 19 local TYPE_LAVA = 26 local TYPE_RUM = 27 local TYPE_SWAMP = 28 local oilLamps = {[2046] = 2044} local casks = {[1771] = TYPE_WATER, [1772] = TYPE_BEER, [1773] = TYPE_WINE} local alcoholDrinks = {TYPE_BEER, TYPE_WINE, TYPE_RUM} local poisonDrinks = {TYPE_SLIME, TYPE_SWAMP} local drunk = createConditionObject(CONDITION_DRUNK) setConditionParam(drunk, CONDITION_PARAM_TICKS, 60000) local poison = createConditionObject(CONDITION_POISON) setConditionParam(poison, CONDITION_PARAM_DELAYED, true) -- Condition will delay the first damage from when it's added setConditionParam(poison, CONDITION_PARAM_MINVALUE, -50) -- Minimum damage the condition can do at total setConditionParam(poison, CONDITION_PARAM_MAXVALUE, -120) -- Maximum damage setConditionParam(poison, CONDITION_PARAM_STARTVALUE, -5) -- The damage the condition will do on the first hit setConditionParam(poison, CONDITION_PARAM_TICKINTERVAL, 4000) -- Delay between damages setConditionParam(poison, CONDITION_PARAM_FORCEUPDATE, true) -- Re-update condition when adding it(ie. min/max value) local exhaust = createConditionObject(CONDITION_EXHAUST) setConditionParam(exhaust, CONDITION_PARAM_TICKS, (getConfigInfo('timeBetweenExActions') - 100)) function onUse(cid, item, fromPosition, itemEx, toPosition) if(itemEx.uid == cid) then if(item.type == TYPE_EMPTY) then doPlayerSendCancel(cid, "It is empty.") return true end if(item.type == TYPE_MANA_FLUID) then if(hasCondition(cid, CONDITION_EXHAUST_HEAL)) then doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUAREEXHAUSTED) return true end if(not doPlayerAddMana(cid, math.random(80, 160))) then return false end doCreatureSay(cid, "Aaaah...", TALKTYPE_ORANGE_1) doSendMagicEffect(toPosition, CONST_ME_MAGIC_BLUE) doAddCondition(cid, exhaust) elseif(item.type == TYPE_LIFE_FLUID) then if(hasCondition(cid, CONDITION_EXHAUST_HEAL)) then doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUAREEXHAUSTED) return true end if(not doCreatureAddHealth(cid, math.random(40, 75))) then return false end doCreatureSay(cid, "Aaaah...", TALKTYPE_ORANGE_1) doSendMagicEffect(toPosition, CONST_ME_MAGIC_BLUE) doAddCondition(cid, exhaust) elseif(isInArray(alcoholDrinks, item.type)) then if(not doTargetCombatCondition(0, cid, drunk, CONST_ME_NONE)) then return false end doCreatureSay(cid, "Aaah...", TALKTYPE_ORANGE_1) elseif(isInArray(poisonDrinks, item.type)) then if(not doTargetCombatCondition(0, cid, poison, CONST_ME_NONE)) then return false end doCreatureSay(cid, "Urgh!", TALKTYPE_ORANGE_1) else doCreatureSay(cid, "Gulp.", TALKTYPE_ORANGE_1) end doChangeTypeItem(item.uid, TYPE_EMPTY) return true end if(not isCreature(itemEx.uid)) then if(item.type == TYPE_EMPTY) then if(isInArray(DISTILLERY_ON, itemEx.itemid)) then doChangeTypeItem(item.uid, TYPE_RUM) return true end if(isInArray(DISTILLERY_OFF, itemEx.itemid)) then doPlayerSendCancel(cid, "You have to process the bunch into the distillery to get rum.") return true end if(isItemFluidContainer(itemEx.itemid) and itemEx.type ~= TYPE_EMPTY) then doChangeTypeItem(item.uid, itemEx.type) doChangeTypeItem(itemEx.uid, TYPE_EMPTY) return true end if(casks[itemEx.itemid] ~= nil) then doChangeTypeItem(item.uid, casks[itemEx.itemid]) return true end local fluidEx = getFluidSourceType(itemEx.itemid) if(fluidEx ~= false) then doChangeTypeItem(item.uid, fluidEx) return true end doPlayerSendCancel(cid, "It is empty.") return true end if(item.type == TYPE_OIL and oilLamps[itemEx.itemid] ~= nil) then doTransformItem(itemEx.uid, oilLamps[itemEx.itemid]) doChangeTypeItem(item.uid, TYPE_NONE) return true end if(hasProperty(itemEx.uid, CONST_PROP_BLOCKSOLID)) then return false end end doDecayItem(doCreateItem(ITEM_POOL, item.type, toPosition)) doChangeTypeItem(item.uid, TYPE_EMPTY) return true end data/actions Cole as seguintes tags no arquivo actions.xml <action itemid="2405" event="script" value="tools/sickle.lua"> <action itemid="5468" event="script" value="tools/fire bug.lua"> <action itemid="5467" event="script" value="other/bunch of sugar cane.lua"> Se você quiser mudar o tempo de duração da máquina funcionando, procure no seu arquivo items.xml pelos IDs 5513 e 5514 e altere o valor do atributo duration. O padrão se não me engano é 15 segundos.
  • Quem Está Navegando   0 membros estão online

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