Ir para conteúdo

FeeTads

Membro
  • Registro em

  • Última visita

Tudo que FeeTads postou

  1. ja me passa o IP que eu vou conferir kkkkkkkkkkkkkkkkkkkkk com esse ultimo script, como ta na desrição ali, 1 NPC faz tudo kkkkkkkkk
  2. FeeTads postou uma resposta no tópico em Suporte Tibia OTServer
    cara, creio q esses 150% ai, ta ligado com a Stamina 40h+, que da 50% a mais de XP, você quer mostrar qual a XP stage atual do cara nesse lugar? se sim tem q alterar as sources tipo pra aparecer ali "XP gain rate: 500%" precisa ser alterado na source com a XP rate do jogo e o lvl do player
  3. se é esse script q você mandou, é só por um Movements de StepIn, quando o char andar sobre o ActionID do move, ele vai receber essas storages, não manjo muito de 12x mas creio q eh o mesmo estilo e essa tag no movements.xml <movevent type="StepIn" actionid="54654" event="script" value="nome-do-arquivo.lua"/> data/movements/scripts/nome-do-arquivo.lua function onStepIn(cid, item, position, fromPosition, toPosition) local actionId = item.actionid if actionId == 54654 then player:setStorageValue(Storage.ForgottenKnowledge.Tomes, 1) player:setStorageValue(Storage.ForgottenKnowledge.LastLoreKilled, 1) player:setStorageValue(Storage.ForgottenKnowledge.TimeGuardianKilled, 1) player:setStorageValue(Storage.ForgottenKnowledge.HorrorKilled, 1) player:setStorageValue(Storage.ForgottenKnowledge.DragonkingKilled, 1) player:setStorageValue(Storage.ForgottenKnowledge.ThornKnightKilled, 1) player:setStorageValue(Storage.ForgottenKnowledge.LloydKilled, 1) player:setStorageValue(Storage.ForgottenKnowledge.LadyTenebrisKilled, 1) player:setStorageValue(Storage.ForgottenKnowledge.AccessMachine, 1) end return true end aonde estão essas storages? provavelmente na sua lib né? se for variavel global, ele vai aceitar nesse script. agora se estiver tipo local Storage.k....... ai assim, vc vai precisar colocar essas storage dentro do script de move tbm
  4. cara tem sim como fazer, mas tipo, se o cara tiver 2 bow, 1 free e 1 donate, ele vai dar upgrade apenas no primeiro tlg? esse script que eu fiz, 1 NPC troca varios itens, só por la no config da linha 1, mas tipo da sim pra fazer 1 npc que troque os 2, mas meio que se o cara tiver o item equipado e 1 free na BP, vai ser trocado o free da bp primeiro, então não sei se isso vai valer a pena, oq tu poderia fazer é replicar esse script e trocar os ID, de free pra donate, e de donate pra super, ai seriam 2 npcs tlg isso eu consigo fazer sim, simples até kkk vai ser 1 check a mais só, mas mano se tu quiser trocar ideia chama discord, não vou te cobrar por esse script não, mas preciso entender melhor como vc quer isso, ai eu scripto e te mostro por call, vai ser mais facil de eu entender tlg? *não sei se posso mandar discord, mas eh " FeeTads#0246 ", caso algum mod veja e não puder mandar contato pode apagar* Discord: FeeTads#0246 local config = { item = {12665, 12661, 1111, 1111, 1111}, --Id dos item free ou necessario pra trocar pelo donate itemDonate = {12653, 12655, 1111, 1111, 1111}, --ID dos item donate itemSuper = {2222,7735,4444,5555,6666,7777}, --ID dos items super donate needSto = true, --só pode trocar 1x por char esse item? storageTroca = 354545, --storage da troca trocarTodos = false --dar upgrade em todos os items que podem ser upgrades na BP? "true" > se tiver 5 item free, vai virar 5 item donate, "false" > vai transformar 1 e sair fora } local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) local flag = 0 if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid local msg = string.lower(msg) if isInArray({"upgrade","upgrades", "donate"}, msg) then --se o player digitar essas palavras (você pode alterar como quiser) talkState[talkUser] = 1 end if talkState[talkUser] == 1 then if getPlayerStorageValue(cid, config.storageTroca) < 1 then --checa a storage do player for i=1, #config.itemDonate do --vai do primeiro até a quantidade de items, NÃO ESQUECER DE COLOCAR qtdItems com a mesma quantidade de items da tabela !IMPORTANTE flag = 1 --flag pra caso o char não tenha o item necessário if doPlayerRemoveItem(cid, config.itemDonate[i], 1) == true then --LEMBRANDO o item e o item donate tem que estar na mesma ordem na tabela config.item e config.itemDonate flag = 0 --reseta o flag pra evitar bugs doPlayerAddItem(cid, config.itemSuper[i], 1) --exemplo: se a Wand Free ta no primeiro slot {xxx...}, no itemDonate = {xxx...} tem que estar em primeiro também doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voce acaba fazer UM upgrade em sua arma "..getItemInfo(config.itemDonate[i]).name.." e Ganhou um "..getItemInfo(config.itemSuper[i]).name..".") if (config.needSto) then --se só puder trocar 1x no NPC setPlayerStorageValue(cid, config.storageTroca, 1) --seta storage como 1, pro player não conseguir trocar de novo else setPlayerStorageValue(cid, config.storageTroca, 0) --seta como 0, o player pode trocar outro item donate por super end npcHandler:say("Obrigado, bye!", cid) talkState[talkUser] = 0 npcHandler:releaseFocus(cid) -- retorna if config.trocarTodos == false then return true end end end for i=1, #config.item do --vai do primeiro até a quantidade de items, NÃO ESQUECER DE COLOCAR qtdItems com a mesma quantidade de items da tabela !IMPORTANTE flag = 1 --flag pra caso o char não tenha o item necessário if doPlayerRemoveItem(cid, config.item[i], 1) == true then --LEMBRANDO o item e o item donate tem que estar na mesma ordem na tabela config.item e config.itemDonate flag = 0 --reseta o flag pra evitar bugs doPlayerAddItem(cid, config.itemDonate[i], 1) --exemplo: se a Wand Free ta no primeiro slot {xxx...}, no itemDonate = {xxx...} tem que estar em primeiro também doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voce acaba fazer UM upgrade em sua arma "..getItemInfo(config.item[i]).name.." e Ganhou um "..getItemInfo(config.itemDonate[i]).name..".") if (config.needSto) then --se só puder trocar 1x no NPC setPlayerStorageValue(cid, config.storageTroca, 1) --seta storage como 1, pro player não conseguir trocar de novo else setPlayerStorageValue(cid, config.storageTroca, 0) --seta como 0, o player pode trocar outro item free por donate end npcHandler:say("Obrigado, bye!", cid) talkState[talkUser] = 0 npcHandler:releaseFocus(cid) -- retorna if config.trocarTodos == false then return true end end end if flag == 1 then talkState[talkUser] = 2 end else npcHandler:say("Desculpe, mas você ja pegou seu item", cid) end end if talkState[talkUser] == 2 then npcHandler:say("Desculpe, mas você não tem o item necessário.", cid) talkState[talkUser] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) dei uma arrumada mais ou menos com oq eu entendi que vc quer. trocarTodos > adicionei um check pra saber se vc quer que o cara troque mais de 1 item, tipo o cara tem 2 free axe, se o trocarTodos = true, ele troca os 2 free axe em donate axe se o trocarTodos = false, ele vai dar upgrade apenas em 1 item (com prioridade no donate) e sair fora como funciona: ID dos items no escopo, retirado o "qtdItems" que era desnecessário. PRIORIZA item donate pra > super donate, se não tiver procura por item free > pra item donate se o player tiver item donate E item free, que podem ser upgrade, vai dar upgrade apenas no donate pro > super donate, ou seja, o player só vai conseguir trocar 1 item 1x, e será priorizado o item donate pro super donate. needSto = true > deixar true pra caso o player troca apenas 1x, se por "false" o player vai poder trocar varias vezes. storageTroca pode ser qualquer numero que vc quiser. !IMPORTANTE! não colocar item com ID errado, pois a função checa se é possivel remover o item do player, ou seja, se o player tiver o item, ele remove e entra na função pra dar o upgrade, se o ID do item donate/super donate estiver errado, ele vai remover o antigo, e vai tentar dar o upgrade e não vai achar, ai o player vai ficar sem item. Então é necessário testar todos os items antes de por em vigor.
  5. cara não entendi muito bem essa parte, pq tipo, se o cara tem o bow free, e fazer upgrade com o NPC, ele vai ter o bow donate, ai é só ele falar "upgrade" de novo que vai ganhar o super donate, OU vc explicou de uma forma meio errada kkkkkkkkk fiz um aqui, testa ai pra ver se funciona, se funcionar larga o rep+ rs data/npc/nome-do-npc.xml <?xml version="1.0" encoding="UTF-8"?> <npc name="[NPC] Trader" script="data/npc/scripts/nome-do-script.lua" floorchange="0" walkinterval="0" access="5" level="1" maglevel="1"> <health now="150" max="150"/> <look type="300" skull="2"/> <parameters> <parameter key="module_shop" value="1" /> <parameter key="message_greet" value="Ola |PLAYERNAME|. Diga Upgrade para receber seu item." /> </parameters> </npc> data/npc/scripts/nome-do-script.lua --[MAKE BY FETADS Discord: FeeTads#0246]-- local config = { qtdItems = 5, --Quantidade de items que irá ter conforme tabela item = {12665, 12661, 1111, 1111, 1111}, --Id dos item free ou necessario pra trocar pelo donate itemDonate = {12653, 12655, 1111, 1111, 1111}, --ID dos item donate needSto = false, --só pode trocar 1x por char esse item? storageTroca = 354545 --storage da troca } local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) local flag = 0 if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid local msg = string.lower(msg) if isInArray({"upgrade","upgrades", "donate"}, msg) then --se o player digitar essas palavras (você pode alterar como quiser) talkState[talkUser] = 1 end if talkState[talkUser] == 1 then if getPlayerStorageValue(cid, config.storageTroca) < 1 then --checa a storage do player local checkitem = #config.item --checkItem recebe a tabela de items pra serem transformados em donate for i=1, config.qtdItems do --vai do primeiro até a quantidade de items, NÃO ESQUECER DE COLOCAR qtdItems com a mesma quantidade de items da tabela !IMPORTANTE flag = 1 --flag pra caso o char não tenha o item necessário if doPlayerRemoveItem(cid, config.item[i], 1) == true then --LEMBRANDO o item e o item donate tem que estar na mesma ordem na tabela config.item e config.itemDonate flag = 0 --reseta o flag pra evitar bugs doPlayerAddItem(cid, config.itemDonate[i], 1) --exemplo: se a Wand Free ta no primeiro slot {xxx...}, no itemDonate = {xxx...} tem que estar em primeiro também doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voce acaba fazer UM upgrade em sua arma "..getItemNameById(config.item[i]).." e Ganhou um "..getItemNameById(config.itemDonate[i])..".") if (config.needSto) then --se só puder trocar 1x no NPC setPlayerStorageValue(cid, config.storageTroca, 1) --seta storage como 1, pro player não conseguir trocar de novo else setPlayerStorageValue(cid, config.storageTroca, 0) --seta como 0, o player pode trocar outro item free por donate end npcHandler:say("Obrigado, bye!", cid) talkState[talkUser] = 0 npcHandler:releaseFocus(cid) -- retorna return true end end if flag == 1 then talkState[talkUser] = 2 end else npcHandler:say("Desculpe, mas você ja pegou seu item", cid) end end if talkState[talkUser] == 2 then npcHandler:say("Desculpe, mas você não tem o item necessário.", cid) talkState[talkUser] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) e será necessário ter essa função na lib tbm. function getItemNameById(itemid) return getItemDescriptionsById(itemid).name end e essa no 101-compat.lua getItemDescriptionsById = getItemInfo
  6. nossa mano, isso é um trampo imenso kkkkkkkkkkkkkkkk, mas bom se deu certo, mas eu indico fortemente vc atualizar essa source, pq isso vai te prejudicar muito no futuro...
  7. vi um post parecido com o seu, ve se isso resolve mano
  8. Então mano, isso só acontecia na versão otx antiga, na atual não derruba não, eu uso isso no meu ot, e funciona 100% Se liga, tomando 365 de dano de poison, ou passando em fire field, continua normal o OT, acho q isso ja foi resolvido a muito tempo mano...
  9. não mano, kkkkkkk ele fala pra vc usar isso dentro do script do action, tipo no teu bau que vc fez, vc adicionou ali "doPlayerAddReflectedItem(cid,id,100) " ele se referia a isso como chamar a função. e eu testei aqui esse script e ele não funciona, não pega a position do player mesmo, esse system de reflect é muito antigo, se tua source for atualizada existe o atributo de reflect mano <attribute key="reflectpercentall" value="10"/> <attribute key="reflectchanceall" value="30"/> se tu source for OTX 2+ ele tem esse atributo que vc bota no item, ai funciona assim <attribute key="reflectpercentall" value="10"/> esse eh referente a quanto dano o player vai receber de volta, ou seja se o player que esta batendo der 100 de dano, vai voltar 10 e vc pode alterar ali conforme quiser, o Value vai de 1 a 100 <attribute key="reflectchanceall" value="30"/> esse é a chance que o player dono do item tem de refletir, ou seja 30% de chance do dano tomado voltar pro atacador, e vc coloca no value qualquer valor de 1 a 100 também isso vai la no item.xml, dentro do item que vc quer que tenha reflect
  10. creio que isso dentro da lib que ta fazendo bugar, vc chama função na lib adicionando e la ele chama a função de novo e fica num loop infinito tipo pela logica: action > chama doplayeradd na lib > dentro da lib ele chama de novo a função... creio que se vc tirar o doPlayerAddReflectedItem(cid,2538,100) da lib para function getItemReflectPercent(itemuid) return getItemAttribute(itemuid, "reflectPercent") end function doPlayerAddReflectedItem(cid, itemid, percent) local item = doPlayerAddItem(cid, itemid) doItemSetAttribute(item, "description", "[Reflect: "..percent.."%]") doItemSetAttribute(item, "reflectPercent", percent) end tenta deixar assim na lib, fecha e abre o ot e tenta clicar no bau
  11. A V5 vai continuar com task progressiva? Ou vai dar pra escolher qual task quiser? Se for por escolha seria melhor em. Interessante seria por pra dar level na recompensas ao inves de XP Tipo configuravel qualquer tipo de recompensa como, skill, level, item dias vip etc...
  12. desculpa reviver o post mas essa parte do código o exp é um pouco bugado, fiz uns testes no meu OT e ele começa contar apartir do 25 exp = 25 é a exp padrão exp = 50 é o dobro então eu tive que dar uns pulo na lib e no global events pra ele calcular e mostrar certo kkkkkkkkkkkkkkkkk teria alguma maneira de arrumar isso? ou nem suporte mais tem?
  13. não entendi mt bem, vc diz trocar a storage 888251 pela do tempo? tipo getPlayerStorageValue(pid, 888251) >= 1 pra getPlayerStorageValue(pid, storangeTempo) < 1 mas de qualquer forma eu teria que saber qual o valor da storage né? ou vc diz colocar mais uma verificação? if getPlayerStorageValue(pid, 888251) >= 1 and ..storagetempo < 1 then ?? eh que eu não fraguei mt bem, pq a storage de tempo é por os.time, eu acho que ficaria muita verificação, e esse codigo é do reset system que aplica o bonus por hit acho que isso poderia lagar muito
  14. não iria lagar muito? conferir em cada hit do player se o tempo ja passou?
  15. @Vodkart cara desculpa ressuscitar esse post, mas eu uso o simple_task v3 pq o v4 tem que fazer task em sequencia, e eu prefiro que o player escolha qual ele quer fazer kkkkkkk vi que tem um bug na parte em que o player decide sair ta task elseif msgcontains(msg, 'yes') and talkState[talkUser] == 2 then setPlayerStorageValue(cid, storagesair, 0) npcHandler:say("Você foi retirado da task com sucesso!", cid) ele seta a storage start do player pra 0 porem quando o player termina a task ele seta pra 0 também setPlayerStorageValue(cid, v.storage, "Finished") setPlayerStorageValue(cid, v.storage_start, 0) fora isso, acontece as vezes de resetar a contagem do nada, ele só reseta a quantidade de kills da task, isso ja foi fixado? vai existir alguma v5 em que o player possa escolher as tasks e tudo mais com a otimização da v4? de novo desculpa reviver o post mas acho esse sistema muito mais incrivel kkkkkkk
  16. o proprio sistema do reset system ja checa function ResetSystem:applyBonuses(pid) local bonus = self:getInfo(pid) if (bonus and bonus.damage_percent) then if getPlayerStorageValue(pid, 888251) >= 1 then --se a storage da quest for mais ou igual a 1 bonusquest = getPlayerStorageValue(pid, 888251) -- recebe conforme a quantidade de vezes que fez a quest else bonusquest = 0; --se não seta pra 0 end setPlayerDamageMultiplier(pid, 1.0 + ((bonus.damage_percent+bonusquest) / 100.0)) else setPlayerDamageMultiplier(pid, 1.0) end end caso ele tenha a storage maior que 1, significa que ele fez a quest tantas vezes, o bonus recebe a storage e depois aplica, esse sistema de damage é direto na source tbm
  17. .Qual servidor ou website você utiliza como base? OTX 2 Qual o motivo deste tópico? mudar como o exura sio cura em diferentes vocações por exemplo. fazer o exura sio curar 30k no EK 15K nos mages 22k nos pallys porém queria que isso fosse aumentando também conformes os leveis mudem, quanto menor o level menos cura e etc.. meu ot tem a base de level 25k como média, ot com resets, porém não quero que o reset afete o exura sio apenas o level. queria colocar essa diferença, tentei de algumas maneiras mas ele não muda nada, não da erro nenhum na distro mas tbm não muda a cura Você tem o código disponível? Se tiver publique-o aqui: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat, COMBAT_PARAM_EFFECT, 35) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) --setHealingFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 64, 65, 67, 69) function onGetFormulaValues(cid, level, maglevel) min = (level * 1 + maglevel * 3) * 1.4 max = (level * 1 + maglevel * 3) * 1.55 if getPlayerSlotItem(cid, Slot).uid ~= 0 and getPlayerSlotItem(cid, Slot).itemid == Item then min = min+(min*(HealPercent/100)) max = max+(max*(HealPercent/100)) end if min < 180 then min = 210 end return min, max end setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") function onCastSpell(cid, var) return doCombat(cid, combat, var) end
  18. @luanluciano93 então acho que eh um pouco diferente desse daily reward (alias gostei do teu me deu uma ideia genial kkkkkkkk posso roubar?) o script funciona da seguinte maneira o action do bau seta a storage tempo pra +24h e seta a storage de dano extra pra +1 ai vem o creature ou o globalEvent que faria o seguinte, a cada 1 minuto checa os players onlines, e caso tenha passado 24 horas desde a ultima vez que ele fez a quest ele perderia a storage de dano extra e apareceria na tela dele que ele perdeu. pq checar a cada 1 minuto? pro cara nao entrar na quest, fazer uma parte deslogar esperar o check logar.... digamos que burlar o sistema então eu precisaria que algo ficasse constantemente checando se ja passou 24horas após ele fazer a quest. e cada vez que ele faz a storage é setada com os.time()+24h pra ele nao perder a storage e ficar tudo certinho. e pq checar constantemente? pro player nao ficar com esse dano extra por muito tempo eu poderia deixar pra checar a cada hora ou quando abrisse a quest por exemplo, mas teria algumas maneiras de burlar e continuar com o dano extra. e pq entre global ou creature? global > checka todos de uma vez (pode ser um peso grande pra distro pegar 300 pessoas online e checkar um por um, setar a storage....) creature > quando o player loga, ele começa um loop de onLogin a cada 1 minuto ele chama a função pra checar a storage, porém são varios loops em tempos aleatorios, e checar 300 players em tempos aleatorios pode fazer com que todo segundo esteja executando um loop e isso cause lag
  19. aaah fraguei então, o global event vai ficar só checando se tem a storage e como a storage do bau eh os.time() de 24h vai ficar certinho então, vlw meu mano +rep
  20. tipo assim @So volto tarde preciso verificar pelo menos a cada 10 minutos, porque a quest é diária porém o portal abre 19h e fecha 19:03h, ai quem não entrar tem que perder a storage após passar 24h de ter clicado no baú, e não da pra fazer uma verificação diaria, pq se o cara logar após a quest ele n vai perder a storage, então eu precisaria de algo que a cada 10 minutos pelo menos verifique os players pra pode tirar essa storage se eles perderem a quest
  21. salve rapaziada, estou fazendo uma quest no meu OT que é necessário faze-la durante 10 dias consecutivos, porém caso o player perca um dia, a storage da quest reseta. Já tenho esses scripts prontos de 2 formas: global event que checa a storage de todos os player online no momento e caso ja tenha passado 24h ele tira a storage do player que está entre os 10 dias de quest. E também tenho um creatureScript de onLogin() que quando o player loga, ele entra num loop de verificação a cada 60s minha duvida: globalEvents vai checar todos os players online de uma só vez e fazer as alterações necessarias, isso pode lagar a distro, ou até mesmo crashar? o creatureScript vai entrar num loop até o player deslogar, isso numa média de 250 pessoa são diversas verificações em momentos diferentes, pode acabar lagando ou crashando? meu OT possui uma media de 300 pessoas online. Script globalEvents é esse: function onThink(interval, lastExecution) local players = {} local timer = os.time() for _, pid in pairs (getPlayersOnline()) do local storage = getPlayerStorageValue(pid, 1231234) if getPlayerStorageValue(pid,888251) > 0 and getPlayerStorageValue(pid,888251) <= 9 then if storage - timer <= 1 then table.insert(players, pid) end end end if #players > 0 then for i = 1, #players do doPlayerSendTextMessage(players[i],22,"seu dano voltou ao normal por vc nao ter feito a quest!") setPlayerStorageValue(players[i],888251,0) end end return true end Script do Creature é esse: local storage = getPlayerStorageValue(cid,1231234) function checkStorage(cid) local timer = os.time() if not isPlayer(cid) then return true end if getPlayerStorageValue(cid,888251) > 0 and getPlayerStorageValue(cid, 888251) <= 9 then if storage - timer <= 1 then setPlayerStorageValue(cid,888251,0) end end addEvent(function() checkStorage(cid) end, 60000) end function onLogin(cid) checkStorage(cid) return true end function onLogout(cid) stopEvent(checkStorage[cid]) return true end caso os códigos nao estejam legiveis me avisem como arrumar em .lua pf se quiserem usar os códigos podem usar a vontade kkkkkkk

Informação Importante

Confirmação de Termo