-
Total de itens
2187 -
Registro em
-
Última visita
-
Dias Ganhos
58
Tudo que Yan Oliveira postou
-
Acho que entendi, então vamos supor que o tempo de recarga para usar novamente seja de 1 minuto, então ele só vai usar depois de 1 minuto. E a potion vai ir curando a vida dentro de um intervalo estabelecido, vamos supor 5 segundos, então a cada 5 segundos ele cura um tanto de vida. Seria isso? Sobre o tanto da cura, não tem muito sentido ser HP máximo + constante, já que o HP máximo vai encher tudo.
-
Poste o script todo.
-
talkaction Sistema Quest em Janela
tópico respondeu ao Yan Oliveira de Yan Oliveira em Actions e Talkactions
Sim, é uma ideia boa. Na verdade eu fiquei pensando e vou refazer esse tutorial, pois ficou igual ao do nosso amigo @RigBy e até peço desculpas para ele por isso. Mas enfim, vou refazer e adicionar verificação por quest feita assim como você sugeriu, obrigado pela sugestão! -
reiniciar Iniciar Servidor Automático Após Shutdown
tópico respondeu ao Yan Oliveira de Yan Oliveira em Tutoriais de Infraestrutura
Obrigado ?! Sim, com certeza! Criei porque vi muitos pedidos e estava sendo puxado já toda vez fazer e explicar individualmente para cada um haha. -
reiniciar Iniciar Servidor Automático Após Shutdown
um tópico no fórum postou Yan Oliveira Tutoriais de Infraestrutura
Distro Restarter by Yan18 Olá caros amigos do Xtibia, hoje irei ensinar como reiniciar a distro do server automaticamente após um shutdown (no sistema operacional Windows). Decidi fazer esse tutorial após ver muitos pedidos sobre isso, não sei se já existe algum tutorial sobre isso aqui no fórum, mas decidi criar junto com um script que exibe uma mensagem para o server todo alertando que o servidor será reiniciado após X minutos. Para isso, irei trabalhar com um arquivo .bat do Windows, para que ele sempre execute a distro quando não estiver sendo executada. ATENÇÃO: Leia isso antes de seguir o tutorial! Esse método só vai funcionar se a sua distro for em interface GUI! Se for por prompt (linha de comando) não irá funcionar porque a distro já será executada em prompt. Começo do Tutorial - Evento Shutdown Para começar, vamos criar um evento global para dar shutdown e exibir uma mensagem de aviso para todos os jogadores que o servidor será reiniciado, para ficar mais sofisticado e bonito o processo. E eles estarem ciente, assim dá tempo de todos irem para um local seguro! Agora vá em Data/Globalevents/Scripts e crie o arquivo shutdown.lua e insira o código dentro: TFS 0.3/0.4 function avisoShutdown(minutos) local minutos_shutdown = 1 -- VARIÁVEL PARA DAR UM TEMPO (EM MINUTOS) PARA SALVAR O SERVIDOR E DEPOIS DAR SHUTDOWN EM SEGUIDA if minutos > 0 then doBroadcastMessage("O servidor será reiniciado em " ..minutos) addEvent(avisoShutdown, 60000, cid, minutos - 1) else doSaveServer() addEvent(doShutdown, minutos_shutdown * 60000) return true end end function onTime() avisoShutdown(5) -- MINUTOS MANDAR MENSAGEM DE AVISO PARA SALVAR E DAR SHUTDOWN end TFS 1.0 / 1.+ function avisoShutdown(minutos) local minutos_shutdown = 1 -- VARIÁVEL PARA DAR UM TEMPO (EM MINUTOS) PARA SALVAR O SERVIDOR E DEPOIS DAR SHUTDOWN EM SEGUIDA if minutos > 0 then if minutos > 1 then broadcastMessage("O servidor será reiniciado em " ..minutos.. " minutos.") else broadcastMessage("O servidor será reiniciado em " ..minutos.. " minuto.") end addEvent(avisoShutdown, 60000, minutos - 1) else saveServer() addEvent(Game.setGameState(GAME_STATE_SHUTDOWN), minutos_shutdown * 60000) return true end end function onTime(interval) avisoShutdown(5) -- MINUTOS MANDAR MENSAGEM DE AVISO PARA SALVAR E DAR SHUTDOWN end Explicação: O script vai fazer um contagem regressiva de minutos (pelo valor definido no parâmetro passado na função avisoShutdown) e depois ele irá ter um delay pelo valor da variável minutos_shutdown. Parece confuso duas variáveis de minutos né? Mas a variável minutos_shutdown é um "delay" para dar tempo de salvar e depois efetuar o shutdown, pois tem servidor que o mapa é grande, tem muitos jogadores e itens, então pode demorar um pouco, ai é só mudar o valor na variável. Está o valor 1 por padrão. E na função chamada pelo evento onTime você coloca os minutos para o player ver os minutos restantes para o servidor ser reiniciado. Agora, abra o arquivo globalevents.xml e adicione a tag: <globalevent name="shutdown_server" time="12:00" event="script" value="shutdown.lua"/> Em time coloque o horário que deseja executar o evento para fazer o shutdown. Agora acabamos a parte do evento e vamos para a parte do reiniciador! - PROMPT (Arquivo .Bat) Agora iremos criar o arquivo bat para reiniciar a distro. Vá no bloco de notas ou no notepad++ (de sua preferência) e insira o seguinte script dentro: title Reinicializador da Distro echo --------- MENSAGEM QUANDO INICIAR A DISTRO ------------ echo. echo Status: INICIANDO O SERVIDOR... echo. :begin TFS.exe echo --------- MENSAGEM QUANDO DESLIGAR OU REINICIAR A DISTRO COM O ARQUIVO BAT ABERTO ------------ echo. echo Aviso: O SERVIDOR FOI DESLIGADO OU SERÁ REINICIADO. echo. echo Status: O SERVIDOR ESTÁ SENDO REINICIADO! echo. goto begin :goto begin Salve esse script (de preferência com um nome sem espaço) com a extensão .bat. Eu recomendo Restarter, mas fica por sua preferência! OBS: Salve o arquivo com a codificação UTF-8, por padrão já vem, mas caso não venha é só colocar! Explicação: @echo off O "echo off" Oculta informações e o código executado pelo sistema, e o "@echo" oculta a interface durante a execução do programa. É possível juntar os dois modos, assim como fiz acima. title Nessa parte você coloca o título do arquivo bat em seguida da palavra reservada title, que fica na parte superior da interface. Só seguir o exemplo anterior da criação do arquivo. OBS: No título você pode colocar espaço a vontade. echo Aqui é onde vai aparecer as mensagens na interface, pode colocar qualquer caractere desejado, pode usar pontos, acentos (acentos acontecerá algo de errado que será explica mas para o fim do tutorial.) e o que desejar. E para dar uma quebra de linha, é só colocar ponto depois do echo: echo. begin É onde começa a executar o procedimento (executar a distro). Mas ai você pergunta: "Mas e as linhas anteriores com mensagens?". Mas a resposta é que as linhas anteriores não executam o programa, e sim inserem mensagem assim que executamos o arquivo bat (ressaltando que quando abrimos o arquivo bat ele inicia a distro, porém só vai reiniciar a distro sempre que der shutdown ou crashar enquanto o arquivo bat estiver aberto). TFS.exe Em baixo do ":begin" vai ter TFS.exe, e nessa linha é onde coloca o nome do executável (distro). OBS: Evite colocar nome da distro com espaço, ele funciona, mas para evitar problemas, deixe junto! goto begin E por fim temos o goto begin, a palavra reservada goto faz um pulo para o que colocar na frente dela, ou seja, depois que executar tudo que está acima dela, vai ir para o que declara na frente, no nosso caso, o begin (irá fazer um loop de reiniciar sempre que a distro estiver desligada no nosso caso enquanto o arquivo bat estiver rodando). Beleza Yan, acabamos? Ainda não acabamos! Tenha calma, se você chegou até aqui, vai aguentar até o fim! Agora iremos executar o arquivo bat (lembrando que se quer usar o auto restarter, não pode abrir a distro antes do arquivo bat, se não vai dar erro de distro já aberta, porque o arquivo irá abrir novamente). Mas antes de rodar, não se esqueça de colocar o arquivo bat no mesmo diretório (pasta) da distro, tem que ficar junto senão não vai funcionar. Feito isso, execute o arquivo bat, se der tudo certo e seguiu os passos corretamente, irá aparecer assim seguindo nossa criação: E a distro irá iniciar logo em seguida. Agora vamos testar um shutdown na distro (lembre-se de deixar o prompt do arquivo bat aberto!): Agora você vai falar, "Funcionou!! Acabamos?", sim de fato funcionou, porém, se repara as mensagens com acento estão "bugadas". Isso se deve ao fato de que por padrão não lê acento (Windows foi criado na língua inglesa). Então, para funcionar precisaremos ir na primeira linha do código do arquivo bat e colocar: chcp 65001 off Pois essa linha permite acentuação (lembrando de permanecer a codificação UTF-8 ainda). Então o script ficará assim: chcp 65001 @echo off echo. title Reinicializador da Distro echo --------- MENSAGEM QUANDO INICIAR A DISTRO ------------ echo. echo Status: INICIANDO O SERVIDOR... echo. :begin TFS.exe echo --------- MENSAGEM QUANDO DESLIGAR OU REINICIAR A DISTRO COM O ARQUIVO BAT ABERTO ------------ echo. echo Aviso: O SERVIDOR FOI DESLIGADO OU SERÁ REINICIADO. echo. echo Status: O SERVIDOR ESTÁ SENDO REINICIADO! echo. goto begin :goto begin Ficando então o script do arquivo bat: Agora temos o caminho do diretório do executável e uma mensagem do sistema alegando que foi ativado esse comando. Se fizer tudo certo é para aparecer assim! E agora vamos testar o shutdown: Como podemos ver executou corretamente e leu os caracteres com acento. Agora vem a pergunta: "Acabou?", e a resposta é... Sim, acabou! Lembrando que você pode encerrar a distro manualmente (fechando) que o arquivo bat irá reiniciar, não precisa depender só do evento shutdown, mas não esqueça de deixar o restarter aberto. Obrigado por ter chegado até aqui e espero que te ajude o tutorial. Qualquer dúvida só perguntar. Logo estarei preparando um tutorial desses para Linux! Abraços e fiquem com Deus! -
Poderia explicar melhor o que quer dizer com escalável e por turno? Eu entendi o seu pedido, mas quero entender melhor, principalmente a parte do turno. Como seria?
-
Já olhou se colocou corretamente o login na tabela accounts do Account Manager? E precisa ver se na source, quando está em sqlite se não está pegando a senha concatenado com a recovery key, algumas bases tem essa verificação na source para ter mais segurança.
-
Amigo, coloque o título do post de forma coerente com seu problema, pois além de ser errado dessa maneira, fica difícil de alguém ir ajudar assim que vê o título. Sobre o post, esse erro é ocasionado por conta que o Sqliteestudio para conseguir ler LIMIT sem a cláusula select, o software (Sqliteestudio) tem que ser compilado com um parâmetro que inclui LIMIT em delete, update e insert. Mas até agora todos os que vi das bases de server não veio, então vai ter que fazer uma sub-consulta no where com select: (UPDATE "players" SET "broadcasting" = 0, "viewers" = 0 WHERE "id" in (SELECT "id" FROM "players" WHERE "id" = 1 LIMIT 1);) Mas se usar o banco MySql vai funcionar normal a query sem precisar fazer a sub-consulta que fiz acima.
-
Com qual char está matando, com char ADM?
-
Sim, é possível. Você pode fazer um evento no globalevents que de shutdown em um horário e (se usar Windows) pode fazer um arquivo bat para iniciar a distro.
-
Já te ajudei lá amigo ?.
-
Você está criando o array/tabela de forma errada, por isso deu erro. E no segundo script você não pode comprar o id de um item com uma tabela, tem que comparar com o valor dentro da tabela. Eu refiz para você: local uniqueitems = {1453, 1450, 15603, 15602, 15604, 15605, 15606, 15607, 15600, 15948, 15599, 15601, 1386, 352, 353, 359, 2407, 2408, 2409, 2404, 2405, 2406, 2401, 2402, 2403, 2397, 2396, 2395, 2398, 2399, 2400, 2386, 2387, 2388, 2394, 2393, 2392, 2391, 2390, 2389, 1805, 1804, 1803, 1808, 1807, 1806, 2382, 2381, 2380, 2383, 2384, 2385, 1796, 1797, 1798, 1799, 1800, 360, 361, 362, 363, 364, 365, 366, 367, 368, 333, 369, 370, 371, 372, 373, 374, 377, 378, 379, 380, 381, 382, 383} function onDeEquip(cid, item) if item.itemid == uniqueitems[item.itemid] then doPlayerSendCancel(cid, "Sorry, this is an unique item.") end end local itens_unique = {1453, 1450, 15603, 15602, 15604, 15605, 15606, 15607, 15600, 15948, 15599, 15601, 1386, 352, 353, 359, 2407, 2408, 2409, 2404, 2405, 2406, 2401, 2402, 2403, 2397, 2396, 2395, 2398, 2399, 2400, 2386, 2387, 2388, 2394, 2393, 2392, 2391, 2390, 2389, 1805, 1804, 1803, 1808, 1807, 1806, 2382, 2381, 2380, 2383, 2384, 2385, 1796, 1797, 1798, 1799, 1800, 360, 361, 362, 363, 364, 365, 366, 367, 368, 333, 369, 370, 371, 372, 373, 374, 377, 378, 379, 380, 381, 382, 383} function onTradeAccept(cid, target, item, targetItem) if item.itemid == itens_unique[item.itemid] then doPlayerSendCancel(cid, "Sorry, you cannot trade this item.") end end Eu arrumei as verificações, mas pode ser que dê erro ainda, só que não tem como eu testar porque precisaria do script todo.
-
Olá amigo, precisa ver se não tem algum arquivo em creaturescripts que está definindo o level máximo para 301 ou se tem alguma configuração em stages.xml na pasta xml que deixa 0 o exp rate quando passa o 300.
-
Haha, faz muitos anos que eu não crio um post, mas acho que é clicando no troféu.
-
Potion de Pokemon Certa quantidade de HP [Resolvido]
pergunta respondeu ao kamus9629 de Yan Oliveira em Scripts
Opa, foi bobeira minha, mas eu refiz o código, testei e agora está funcionando: -- REFEITO POR YAN18 PARA RESTAURAR VIDA POR VALOR CONSTANTE -- function doHealOverTime(cid, hp, effect) if not isCreature(cid) then return true end doSendMagicEffect(getThingPos(cid), effect) doCreatureAddHealth(cid, math.floor(hp)) end local potions = { [1456] = {effect = 13, hp = 50000}, -- super potion [1451] = {effect = 13, hp = 50000}, -- great potion [384] = {effect = 12, hp = 50000}, -- ultra potion [385] = {effect = 14, hp = 50000}, -- hyper potion [392] = {effect = 14, hp = 50000}, -- full restore [667] = {effect = 14, hp = 50000}, -- full restore [668] = {effect = 14, hp = 50000}, -- full restore [669] = {effect = 14, hp = 50000}, -- full restore [670] = {effect = 14, hp = 50000}, -- full restore [671] = {effect = 14, hp = 50000}, -- full restore } function onUse(cid, item, frompos, item2, topos) local pid = getThingFromPosWithProtect(topos) if not isSummon(pid) or getCreatureMaster(pid) ~= cid then return doPlayerSendCancel(cid, "You can only use potions on your own Pokemons!") end if getCreatureHealth(pid) == getCreatureMaxHealth(pid) then return doPlayerSendCancel(cid, "This pokemon is already at full health.") end if getPlayerStorageValue(pid, 173) >= 1 then setPlayerStorageValue(pid, 173, -1) end if getPlayerStorageValue(cid, 52481) >= 1 then return doPlayerSendCancel(cid, "You can't do that while a duel.") end if getPlayerStorageValue(cid, 990) >= 1 then doPlayerSendCancel(cid, "You can't use potion during gym battles.") return true end doCreatureSay(cid, "".. getCreatureName(pid)..", take this potion!", TALKTYPE_MONSTER) doSendMagicEffect(getThingPos(pid), 0) setPlayerStorageValue(pid, 173, 1) doRemoveItem(item.uid, 1) local a = potions[item.itemid] doHealOverTime(pid, a.hp, a.effect) doPlayerSendCancel(cid, "Your monsters recovered " ..a.hp.. " of HP.") return true end Ai para configurar o HP, você precisa mudar os valores na variável hp de cada potion (item) na tabela potions onde está 50000 para todos. -
Eu refiz os scripts. 1º Script da Loja: local storage_vipdays = 225501 -- VARIÁVEL QUE VERIFICA TUDO QUE É VIP local dias_vip = 30 -- DIAS PARA SER VIP local item = 2145 -- ITEM QUE REMOVE PARA DAR VIP local quantidade_item = 15 -- QUANTIDADE DO ITEM QUE TORNA VIP function onSay(cid, words, param, channel) if getPlayerStorageValue(cid, storage_vipdays) <= 0 then if getPlayerItemCount(cid, item) >= quantidade_item then doPlayerRemoveItem(cid, item, quantidade_item) doSendMagicEffect(getThingPos(cid), 28) doPlayerAddPremiumDays(cid, dias_vip) doPlayerSendCancel(cid, "Agora você é VIP Account!") doPlayerSendTextMessage(cid, 20, "Você recebeu " ..dias_vip.. " dias de VIP Account. Agora você terá +30% EXP, acesso à áreas exclusivas, e outros benefícios!") setPlayerStorageValue(cid, storage_vipdays, os.time() + dias_vip * 24 * 60 * 60) return true else return doPlayerSendTextMessage(cid, 20, "Você não tem " ..quantidade_item.. " " ..getItemNameById(item).. " para realizar a compra.") end else return doPlayerSendTextMessage(cid, 20, "Você ainda é VIP Account.") end end 2º Script do Item (Actions): local storage_vipdays = 225501 -- VARIÁVEL QUE VERIFICA TUDO QUE É VIP local dias_vip = 30 --DIAS PARA SER VIP function onUse (cid, item, frompos, item2, topos, words, param) if getPlayerStorageValue(cid, storage_vipdays) <= 0 then doRemoveItem(item.uid, 1) doSendMagicEffect(getThingPos(cid), 28) doPlayerAddPremiumDays(cid, dias_vip) doPlayerSendCancel(cid, "Agora você é VIP Account!") doPlayerSendTextMessage(cid, 20, "Você recebeu " ..dias_vip.. " dias de VIP Account. Agora você terá +30% EXP, acesso à áreas exclusivas, e outros benefícios!") setPlayerStorageValue(cid, storage_vipdays, os.time() + dias_vip * 24 * 60 * 60) return true else return doPlayerSendTextMessage(cid, 20, "Você ainda é VIP Account.") end end Não esqueça de salvar o arquivo com codificação ANSI por conta dos acentos. Sobre seu segundo post que me marcou: Do jeito que você alterou vai dar errado amigo, pois para número real (float/double) em lua tem que usar o ".", pois a vírgula é usada para separação. local exp = 3.09 local color = 210 local texto = " (VIP)" if getPlayerPremiumDay(cid) > 0 then CÓDIGO AQUI end Eu arrumei aqui para você, não se essas variáveis da suas verificação já foram criadas, mas procure sempre usar local antes de variável criada quando ela será usada somente em um arquivo, pois sem "local" se torna variável global e se você criar outra variável com esse nome em outro arquivo pode dar conflito e dar problema. Separei as variáveis para você e já coloquei os valores, só colocar no código, mas qualquer coisa posta o script que eu arrumo para você.
-
Que bom que conseguiu resolver! Mas qual o sentido de colocar o nível do pokémon vezes 1? Qualquer número vezes 1 é ele mesmo, não tem sentido em deixar essa multiplicação ?. Mas é isso ai!
-
Sobre o post, que bom que funcionou ?. Haha é assim mesmo, um nome errado, qualquer caractere errado já buga tudo, Sobre seu pc, que chato cara, mas pelo menos foi só a fonte, semana retrasada perdi meu HD, tinha feito várias coisas em várias bases, tinha migrado uma base mysql para sqlite e perdi. Mas fonte é só comprar outra, se fosse HD ai seria complicado, perder suas coisas pessoal. Mas não esquece também de trocar a pasta térmica do processador para não correr risco de perder haha, ainda mais se mora em uma região quente. Coloque por gentileza a resposta com o código como a melhor resposta, para caso outra pessoa queira ela encontre, e também como resolvido o tópico ?. Abraços.
-
A área certa é em Pedidos de Script, e como assim usar "seu passivo"? Você diz ele usar os ataques passivo? Eles são definidor no configuration.lua que fica na pasta Data/Lib.
-
Funcionou certinho? Seu script não sentido, ele queria apenas que colocasse um tempo para que transformasse o item novamente, já estava funcionando a transformação, só precisava do tempo. Já o seu script usa a função Decay que seria "apodrecer" o item, que é usado mais para árvores, bush ou buracos (mais coisas que envolvem natureza ou ambiente, e tendo definido para o item "novo" no items.xml). Mas não é o caso do pedido do colega. E no seu script não tem um tempo definido para transformar o item.
-
Entendi, antes de function onUse adicione essa função: ---- FUNÇÃO QUE VOLTA O ITEM APÓS X SEGUNDOS ---- function contagemSegundosItem(cid, old_item, new_item, segundos) local item_antigo = old_item.itemid local old_position = getThingPos(old_item.uid) doTransformItem(old_item.uid, new_item.itemid) local item_tile = getTileItemById(old_position, new_item) if item_tile.uid then if segundos > 0 then addEvent(contagemSegundosItem, 60000, cid, old_item, new_item, segundos-1) else doTransformItem(item_tile.uid, item_antigo) end end end E na parte do function onUse onde estava seu código antigo, apague aquele bloco e chame a função: contagemSegundosItem(cid, itemEx, ItemQuebrado, 5) -- CID, ITEM QUE VAI SER TRANSFORMADO, NOVO ITEM, E OS SEGUNDOS Testa e me fala se der problema.
-
Problema com drop de Key com Action ID
pergunta respondeu ao FlamesAdmin de Yan Oliveira em Programação
Eu dei uma olhada em duas sources de duas bases diferentes, e em ambas o arquivo monster.cpp na função createLoot está diferente da sua na parte da actionid, está: if(lootBlock.actionId != -1) tmpItem->setActionId(lootBlock.actionId); Teria que olhar todo o código para ver. -
NPC OU COMANDO DE REPARAR SOFT BOOTS TFS 1.2
pergunta respondeu ao Wakachizi de Yan Oliveira em Scripts
Eu fiz as duas maneiras para você, por NPC e Talkactions. NPC Começando pelo NPC, vai em Data/Npc/ e crie o arquivo Botan.xml (pode colocar outro nome se quiser), e adicione o código dentro: <?xml version="1.0" encoding="UTF-8"?> <npc name="Botan" script="botan.lua" walkinterval="0" floorchange="0"> <health now="150" max="150"/> <look type="134" head="78" body="88" legs="0" feet="88" addons="3"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|, say {help} or {repair} to more informations." /> </parameters> </npc> Agora em Data/Npc/Scripts crie o arquivo Botan.lua e adicione o código: 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) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local id_worn_boot = 10021 -- ID DA BOTA ESTREGADA QUE VAI SER REPARADA local id_soft_boot = 6132 -- ID DA BOTA REPARADA local id_platinum_coin = 2152 -- ID PLATINUM COIN local quantidade_coin = 50 -- QUANTIDADE DE PLATINUM COIN PARA REPARAR A BOTA ---------------------------- CÓDIGO ------------------------------------------- if msgcontains(msg, 'help') or msgcontains(msg, 'repair') then selfSay('I repair your boot to '.. getItemName(id_soft_boot).. ' for ' ..quantidade_coin.. ' ' ..getItemName(id_platinum_coin).. '.' .. ' Do you want?', cid) talkState[talkUser] = 1 elseif msgcontains(msg, 'yes') and talkState[talkUser] == 1 then if getPlayerItemCount(cid, id_platinum_coin) >= quantidade_coin then if getPlayerSlotItem(cid, 8).itemid == id_worn_boot then doPlayerRemoveItem(cid, id_platinum_coin, quantidade_coin) doTransformItem(getPlayerSlotItem(cid, 8).uid, id_soft_boot) selfSay("Sua bota foi reparada com sucesso!", cid) talkState[talkUser] = 0 return true elseif getPlayerSlotItem(cid, 8).itemid ~= id_worn_boot and getPlayerItemById(cid, true, id_worn_boot).itemid == id_worn_boot then doPlayerRemoveItem(cid, id_platinum_coin, quantidade_coin) doTransformItem(getPlayerItemById(cid, true, id_worn_boot).uid, id_soft_boot) selfSay("Sua bota foi reparada com sucesso!", cid) talkState[talkUser] = 0 return true else selfSay("Você não tem a bota, verifique se a bota está dentro da mochila ou se está no slot errado.", cid) talkState[talkUser] = 0 return true end else selfSay("Você não tem " ..quantidade_coin.. " "..getItemName(id_platinum_coin).. ".", cid) talkState[talkUser] = 0 return true end elseif msgcontains(msg, 'no') and talkState[talkUser] == 1 then selfSay("Ok, goodbye!", cid) talkState[talkUser] = 0 return true end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) TALKACTION Agora a talkaction, vai em Data/Talkactions/Scripts e crie o arquivo repair.lua e adicione o código dentro: local id_worn_boot = 10021 -- ID DA BOTA ESTREGADA QUE VAI SER REPARADA local id_soft_boot = 6132 -- ID DA BOTA REPARADA local id_platinum_coin = 2152 -- ID PLATINUM COIN local quantidade_coin = 50 -- QUANTIDADE DE PLATINUM COIN PARA REPARAR A BOTA function onSay(cid, words, param, channel) if getPlayerItemCount(cid, id_platinum_coin) >= quantidade_coin then if getPlayerSlotItem(cid, 8).itemid == id_worn_boot then doPlayerRemoveItem(cid, id_platinum_coin, quantidade_coin) doTransformItem(getPlayerSlotItem(cid, 8).uid, id_soft_boot) doPlayerSendTextMessage(cid, 27, "Sua bota foi reparada com sucesso!") return true elseif getPlayerSlotItem(cid, 8).itemid ~= id_worn_boot and getPlayerItemById(cid, true, id_worn_boot).itemid == id_worn_boot then doPlayerRemoveItem(cid, id_platinum_coin, quantidade_coin) doTransformItem(getPlayerItemById(cid, true, id_worn_boot).uid, id_soft_boot) doPlayerSendTextMessage(cid, 27, "Sua bota foi reparada com sucesso!") return true else doPlayerSendTextMessage(cid, 27, "Você não tem a bota, verifique se a bota está dentro da mochila ou se está no slot errado.") return true end else doPlayerSendTextMessage(cid, 27, "Você não tem " ..quantidade_coin.. " "..getItemName(id_platinum_coin).. ".") return true end end E por fim abre o talkactions.xml e adicione a tag: <talkaction log="yes" words="!repair_boots" event="script" value="repair.lua"/> Fiz das duas formas, tanto o npc quanto por talkactions é necessário pagar a quantidade de platinum coins que deixei em quantidade_coin, só mudar o valor também caso queira (se quiser que eu removo essa verificação só falar), deixei comentado as variáveis com o id de cada bota, só colocar o id da bota estragada e a que vai ser reparada. Por Talkactions tem que falar o comando !repair_boots para reparar. Testei aqui e funcionou, só tive que mudar a função getPlayerItemNameById por getItemName porque na TFS 1.1+ mudou o nome da função. Mas teste e me fale. -
Vai em Data/Lib abra o Pokedex System.lua e procura essa linha: doShowTextDialog(cid, v, table.concat(stt)) comente ou remova a linha que não irá aparecer mais a janela.
-
Tem que ver se sua base está trabalhando com stages de exp, precisa verificar no config.lua, procure por essa parte: experienceStages = true rateExperience = 500 Se estiver false, mude para true, e a linha de baixo será a taxa, precisará balancear de acordo com seu gosto. Após fazer isso, teste novamente com o script que arrumei para você, e não esqueça de configurar lá também a função setExpRate, lembrando que os parâmetros são: setExpRate(cid, RESET_MINIMO, RESET_MAXIMO, RATE_EXP). Eu deixei alguns de exemplo lá, só configurar ou basear.
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.