Ir para conteúdo

Yan Oliveira

Moderador
  • Total de itens

    2187
  • Registro em

  • Última visita

  • Dias Ganhos

    58

Tudo que Yan Oliveira postou

  1. Você não falou que queria a exp x5, só disse que estava com mesmo erro, e no caso deu a entender que queria exp que define no xml do pokémon. Substitua o script por esse: local function playerAddExp(cid, exp) doPlayerAddExp(cid, exp) doSendAnimatedText(getThingPos(cid), exp, 215) end function onDeath(cid, corpse, deathList) --if not isCreature(cid) then return true end if isSummon(cid) or not deathList or getCreatureName(cid) == "Evolution" then return true end --alterado v1.8 local givenexp = getWildPokemonExp(cid) ---local killer = getItemAttribute(corpse.uid, "corpseowner") if givenexp > 0 then for a = 1, #deathList do local pk = deathList[a] --- local list = getSpectators(getThingPosWithDebug(pk), 30, 30, false) if isCreature(pk) then local expTotal = math.floor(givenexp * getDamageMapPercent(pk, cid)) local party = getPartyMembers(pk) if isInParty(pk) and getPlayerStorageValue(pk, 4875498) <= -1 then expTotal = math.floor(expTotal/#party) --alterado v1.6.1 for i = 1, #party do if isInArray(list, party[i]) then if getPlayerLevel(pk) <= 50 then playerAddExp(party[i], expTotal * 5) elseif getPlayerLevel(pk) >= 51 and getPlayerLevel(pk) <= 75 then playerAddExp(party[i], expTotal * 5) elseif getPlayerLevel(pk) >= 76 and getPlayerLevel(pk) <= 100 then playerAddExp(party[i], expTotal * 5) elseif getPlayerLevel(pk) >= 101 and getPlayerLevel(pk) <= 150 then playerAddExp(party[i], expTotal * 5) elseif getPlayerLevel(pk) >= 151 and getPlayerLevel(pk) <= 250 then playerAddExp(party[i], expTotal * 5) elseif getPlayerLevel(pk) >= 251 and getPlayerLevel(pk) <= 350 then playerAddExp(party[i], expTotal * 5) elseif getPlayerLevel(pk) >= 351 then playerAddExp(party[i], expTotal * 50) end end end elseif not isInParty(pk) then if getPlayerLevel(pk) <= 50 then playerAddExp(pk, math.floor(5 * (givenexp * getDamageMapPercent(pk, cid)))) elseif getPlayerLevel(pk) >= 51 and getPlayerLevel(pk) <= 75 then playerAddExp(pk, math.floor(5 * (givenexp * getDamageMapPercent(pk, cid)))) elseif getPlayerLevel(pk) >= 76 and getPlayerLevel(pk) <= 100 then playerAddExp(pk, math.floor(5 * (givenexp * getDamageMapPercent(pk, cid)))) elseif getPlayerLevel(pk) >= 101 and getPlayerLevel(pk) <= 150 then playerAddExp(pk, math.floor(5 * (givenexp * getDamageMapPercent(pk, cid)))) elseif getPlayerLevel(pk) >= 151 and getPlayerLevel(pk) <= 250 then playerAddExp(pk, math.floor(5 * (givenexp * getDamageMapPercent(pk, cid)))) elseif getPlayerLevel(pk) >= 251 and getPlayerLevel(pk) <= 350 then playerAddExp(pk, math.floor(5 * (givenexp * getDamageMapPercent(pk, cid)))) elseif getPlayerLevel(pk) >= 351 then playerAddExp(pk, math.floor(5 * (givenexp * getDamageMapPercent(pk, cid)))) return true end end end end end if isNpcSummon(cid) then local master = getCreatureMaster(cid) doSendMagicEffect(getThingPos(cid), getPlayerStorageValue(cid, 10000)) doCreatureSay(master, getPlayerStorageValue(cid, 10001), 1) doRemoveCreature(cid) return false end if corpse.itemid ~= 0 then --alterado v1.8 doItemSetAttribute(corpse.uid, "level", getPokemonLevel(cid)) doItemSetAttribute(corpse.uid, "gender", getPokemonGender(cid)) end return true end Testa e vê se é assim que quer, deixei para multiplicar a exp do pokémon que está no xml por 5, exemplo, a exp do Charizard está definido no xml como 1500, então a exp vai ser 1500 * 5 = 7500.
  2. local function playerAddExp(cid, exp) doPlayerAddExp(cid, exp) doSendAnimatedText(getThingPos(cid), exp, 215) end function onDeath(cid, corpse, deathList) --if not isCreature(cid) then return true end if isSummon(cid) or not deathList or getCreatureName(cid) == "Evolution" then return true end --alterado v1.8 local givenexp = getWildPokemonExp(cid) ---local killer = getItemAttribute(corpse.uid, "corpseowner") if givenexp > 0 then for a = 1, #deathList do local pk = deathList[a] --- local list = getSpectators(getThingPosWithDebug(pk), 30, 30, false) if isCreature(pk) then local expTotal = math.floor(givenexp * getDamageMapPercent(pk, cid)) local party = getPartyMembers(pk) if isInParty(pk) and getPlayerStorageValue(pk, 4875498) <= -1 then expTotal = math.floor(expTotal/#party) --alterado v1.6.1 for i = 1, #party do if isInArray(list, party[i]) then if getPlayerLevel(pk) <= 50 then playerAddExp(party[i], expTotal) elseif getPlayerLevel(pk) >= 51 and getPlayerLevel(pk) <= 75 then playerAddExp(party[i], expTotal) elseif getPlayerLevel(pk) >= 76 and getPlayerLevel(pk) <= 100 then playerAddExp(party[i], expTotal) elseif getPlayerLevel(pk) >= 101 and getPlayerLevel(pk) <= 150 then playerAddExp(party[i], expTotal) elseif getPlayerLevel(pk) >= 151 and getPlayerLevel(pk) <= 250 then playerAddExp(party[i], expTotal) elseif getPlayerLevel(pk) >= 251 and getPlayerLevel(pk) <= 350 then playerAddExp(party[i], expTotal) elseif getPlayerLevel(pk) >= 351 then playerAddExp(party[i], expTotal) end end end elseif not isInParty(pk) then if getPlayerLevel(pk) <= 50 then playerAddExp(pk, math.floor(givenexp * getDamageMapPercent(pk, cid))) elseif getPlayerLevel(pk) >= 51 and getPlayerLevel(pk) <= 75 then playerAddExp(pk, math.floor(givenexp * getDamageMapPercent(pk, cid))) elseif getPlayerLevel(pk) >= 76 and getPlayerLevel(pk) <= 100 then playerAddExp(pk, math.floor(givenexp * getDamageMapPercent(pk, cid))) elseif getPlayerLevel(pk) >= 101 and getPlayerLevel(pk) <= 150 then playerAddExp(pk, math.floor(givenexp * getDamageMapPercent(pk, cid))) elseif getPlayerLevel(pk) >= 151 and getPlayerLevel(pk) <= 250 then playerAddExp(pk, math.floor(givenexp * getDamageMapPercent(pk, cid))) elseif getPlayerLevel(pk) >= 251 and getPlayerLevel(pk) <= 350 then playerAddExp(pk, math.floor(givenexp * getDamageMapPercent(pk, cid))) elseif getPlayerLevel(pk) >= 351 then playerAddExp(pk, math.floor(givenexp * getDamageMapPercent(pk, cid))) return true end end end end end if isNpcSummon(cid) then local master = getCreatureMaster(cid) doSendMagicEffect(getThingPos(cid), getPlayerStorageValue(cid, 10000)) doCreatureSay(master, getPlayerStorageValue(cid, 10001), 1) doRemoveCreature(cid) return false end if corpse.itemid ~= 0 then --alterado v1.8 doItemSetAttribute(corpse.uid, "level", getPokemonLevel(cid)) doItemSetAttribute(corpse.uid, "gender", getPokemonGender(cid)) end return true end Pronto, já tirei a exp extra tanto em party quanto fora, e agora pega a exp exata do pokémon selvagem (definido no arquivo xml) mas deixei para multiplicar pela função getDamageMapPercente, que é uma função que pega porcentagem do monstro de acordo com o dano que ele deu em um pokémon (isso só se aplica quando mais de um jogador ataca o mesmo pokémon, quem dar mais dano fica com o pokémon). Se matar um monstro sozinho no seu servidor vai ver que vai pegar a exp exata do pokémon, porém se outro player atacar ele, vai ver que a exp não vai vir exata, mas de acordo com o tanto que você atacou o pokémon. E a função getDamageMapPercent não sei o valor da porcentagem que trabalha porque é uma função feita na source, mas sempre que atacar sozinho um pokémon, vai vir 100% da exp dele.
  3. Não, ai é só criação de variáveis estáticas, você tem que colocar onde eu falei, em baixo da function onUse. Mas nos script da moto police e rcoket eu já fiz essa verificação.
  4. Depende, não é sempre. Depende muito do que você quer fazer.
  5. Já adicionei a verificação de premium nas duas conforme te falei no post que coloquei os scripts.
  6. Que bom que funcionou Posso sim function onUse(cid, item, frompos, itemEx, topos) if not isPremium(cid) then doPlayerSendTextMessage(cid, 27, "Você precisa ser premium para trocar o dinheiro.") return true end if item.itemid == 2160 then doPlayerRemoveItem(item.uid, 1) doPlayerAddItem(cid, 2152, 100) return true end return true end Nesse exemplo, se o player tem 2160 (Platinum Coin ou 1K) ele recebe 100 (Gold Coin ou 100 Dólares). Mas ele só pode dar use no item se ele for premium, se não for ele recebe a mensagem e finaliza o script, sendo assim, o player não consegue usar o item. Mas por que a verificação do premium tem que estar no começo? Porque as linguagens de programação são top-down, ou seja, leem os códigos de cima para baixo, e Lua é uma linguagem interpretada, ou seja ela vai lendo linha por linha e executando conforme vai lendo, diferente de linguagem compilada que primeiro lê tudo e depois verifica se deu certo ou não o código. Lua já da alerta e para o funcionamento do script na primeira linha errada. Então sabendo isso, precisa estar no começo a verificação, por que se deixar em baixo da funcionalidade do script (que é verificar se tem o item e remover/adicionar os itens) ele vai sempre executar essas ações primeiro e depois vai verificar se é premium, ai já está errado, porque não adiantará nada ser premium, pois qualquer um poderá usar! Era isso que queria saber?
  7. Beleza, testa e me fala, lembrando que precisa colocar o número da storage de police/rocket corretas, se não vai sempre permitir mesmo se não forem. A 52000 e 52001 não são a correta, só coloquei para ter um elemento e para ficar de exemplo para você. Sobre a sua dúvida, é só ir no script de cada veículo bike/carro e etc e fazer uma verificação no começo: if not isPremium(cid) then doPlayerSendCancel(cid, "Você precisa ser Premium para usar esse veículo.") -- MENSAGEM BRANCA NO CANTO INFERIOR CENTRAL DA TELA (EM CIMA DO CONSOLE) doPlayerSendTextMessage(cid, 27, "Você precisa ser Premium para usar esse veículo.") -- MENSAGEM EM AZUL NO CONSOLE (CHAT DO PLAYER) return true end Coloca bem no começo do script (em baixo (começo) da função onUse).
  8. Nessas linhas: Police: local storage_police = 52000 -- STORAGE PARA O PLAYER QUE É POLICE Rocket: local storage_rocket = 52001 -- STORAGE PARA O PLAYER QUE É ROCKET Deixei a criação das variáveis no começo do script com comentário para identificar onde está e para que servem. Mas lembrando que ela tem chave e valor, o que número dela, no caso dos exemplos que fiz 52000 e 52001 são chaves, o valor deles como padrão vem como -1, sendo que você pode mudar através da função setPlayerStorageValue, também é possível mudar na tabela player_storages no banco. E deixei para verificar que são Police ou Rocket com o valor 1, mas pode ter sido que colocaram como 0 (mas é muito raro, geralmente é 1). Mas é nessas duas linhas acima que você precisa colocar o número das storages.
  9. Moto Police: local strgs = {17000, 17001} -- Coloque a Storage de Controle dos Sistemas Que Deseja Bloquear. local config = { outfitMale = 5510, -- Outfit male outfitFemale = 5509, -- Outfit female storageValue = 323339, -- Storage Para a bike } local storage_police = 52000 -- STORAGE PARA O PLAYER QUE É POLICE function onUse(cid, item, itemEx, fromPosition, toPosition) if getPlayerStorageValue(cid, storage_police) < 1 then doPlayerSendCancel(cid, "Você precisa ser Police para usar essa moto.") return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você precisa ser Police para usar essa moto.") end if isPremium(cid) then ctrl = 0 for x = 1, #strgs do if getPlayerStorageValue(cid, strgs[x]) > 0 then ctrl = ctrl + 1 end end if ctrl < 1 then if isPlayer(cid) and getCreatureOutfit(cid).lookType == 814 then return false end if getPlayerStorageValue(cid, 92001) >= 1 then doPlayerSendCancel(cid, "Você não pode usar bike e robo ao mesmo tempo.") return false end if getPlayerStorageValue(cid, 92002) >= 1 then doPlayerSendCancel(cid, "Você não pode usar bike e robo ao mesmo tempo.") return false end if getPlayerStorageValue(cid, 92003) >= 1 then doPlayerSendCancel(cid, "Você não pode usar bike e robo ao mesmo tempo.") return false end if getPlayerStorageValue(cid, 92004) >= 1 then doPlayerSendCancel(cid, "Você não pode usar bike e robo ao mesmo tempo.") return false end if getPlayerStorageValue(cid, 92005) >= 1 then doPlayerSendCancel(cid, "Você não pode usar bike e robo ao mesmo tempo.") return false end if getPlayerStorageValue(cid, 19000) == 1 then doPlayerSendCancel(cid, "Você não pode usar bike e correr ao mesmo tempo.") return false end if getPlayerStorageValue(cid, config.storageValue) <= 0 then local a = {lookType = config.outfitMale, lookHead = getCreatureOutfit(cid).lookHead, lookBody = getCreatureOutfit(cid).lookBody, lookLegs = getCreatureOutfit(cid).lookLegs, lookFeet = getCreatureOutfit(cid).lookFeet} local b = {lookType = config.outfitFemale, lookHead = getCreatureOutfit(cid).lookHead, lookBody = getCreatureOutfit(cid).lookBody, lookLegs = getCreatureOutfit(cid).lookLegs, lookFeet = getCreatureOutfit(cid).lookFeet} setPlayerStorageValue(cid, 32001, ""..getPlayerStamina(cid).."") doChangeSpeed(cid, 1500) setPlayerStorageValue(cid, config.storageValue, 1) if getPlayerSex(cid) == 0 then doSetCreatureOutfit(cid, b, -1) else doSetCreatureOutfit(cid, a, -1) end else setPlayerStorageValue(cid, config.storageValue, 0) doRemoveCondition(cid, CONDITION_OUTFIT) doRegainSpeed(cid) end else doPlayerSendCancel(cid, "Você não pode usar bike enquanto está no Fly/Hide.") end else doPlayerSendCancel(cid, "Você precisa ser Premium para usar essa moto.") return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você precisa ser Premium para usar essa moto.") end return true end Moto Rocket: local strgs = {17000, 17001} -- Coloque a Storage de Controle dos Sistemas Que Deseja Bloquear. local config = { velocidadeDaSuaBike = 1500, -- A volocidade da bike (1-9) outfitMale = 5517, -- Outfit male outfitFemale = 5516, -- Outfit female storageValue = 32053, -- Storage Para a bike } local storage_rocket = 52001 -- STORAGE PARA O PLAYER QUE FOR ROCKET function onUse(cid, item, itemEx, fromPosition, toPosition) if getPlayerStorageValue(cid, storage_rocket) < 1 then doPlayerSendCancel(cid, "Você precisa ser Rocket para usar essa moto.") return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você precisa ser Rocket para usar essa moto.") end if isPremium(cid) then ctrl = 0 for x = 1, #strgs do if getPlayerStorageValue(cid, strgs[x]) > 0 then ctrl = ctrl + 1 end end if ctrl < 1 then if isPlayer(cid) and getCreatureOutfit(cid).lookType == 814 then return false end if getPlayerStorageValue(cid, config.storageValue) <= 0 then local a = {lookType = config.outfitMale, lookHead = getCreatureOutfit(cid).lookHead, lookBody = getCreatureOutfit(cid).lookBody, lookLegs = getCreatureOutfit(cid).lookLegs, lookFeet = getCreatureOutfit(cid).lookFeet} local b = {lookType = config.outfitFemale, lookHead = getCreatureOutfit(cid).lookHead, lookBody = getCreatureOutfit(cid).lookBody, lookLegs = getCreatureOutfit(cid).lookLegs, lookFeet = getCreatureOutfit(cid).lookFeet} setPlayerStorageValue(cid, 32001, ""..getPlayerStamina(cid).."") doChangeSpeed(cid, -getCreatureSpeed(cid)) doChangeSpeed(cid, config.velocidadeDaSuaBike) setPlayerStorageValue(cid, config.storageValue, 1) if getPlayerSex(cid) == 0 then doSetCreatureOutfit(cid, b, -1) else doSetCreatureOutfit(cid, a, -1) end else setPlayerStorageValue(cid, config.storageValue, 0) doRemoveCondition(cid, CONDITION_OUTFIT) doRegainSpeed(cid) end else doPlayerSendCancel(cid, "Você não pode usar a moto enquanto está no Fly/Ride.") end else doPlayerSendCancel(cid, "Você precisa ser Premium para usar essa moto.") return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você precisa ser Premium para usar essa moto.") end return true end Fiz verificação se é Police ou Rocket e se é premium. Na variável storage_police e storage_rocket só colocar a storage de cada, e lembrando que deixei para ver se são com o valor de storage 1, então se for 0 o valor da storage, precisa mudar na verificação. Mas testa e fala se der algum problema.
  10. Isso não é erro de duplicata, mas sim que a spell está usando um nome reservado, precisa mudar a nomenclatura.
  11. Que bom que deu certo! ? Caso tenha gostado e te ajudado, não esqueça de deixar um rep ?
  12. No prompt está falando que o TFS.exe não é reconhecido como comando, ou seja, você não colocou o nome da sua distro corretamente. Creio que copiou o script mas esqueceu de seguir o passo de colocar o nome da sua distro.
  13. Sim, eu fiz um tutorial esses dias bem completo explicando detalhadamente, confere lá: https://www.xtibia.com/forum/topic/251534-iniciar-servidor-automático-após-shutdown/
  14. Olá amigos do Xtibia, venho trazer um tutorial simples, mas interessante, que exibe uma caixa de diálogo com texto contendo todas as quests do seu servidor. Atenção: Testado somente em TFS 0.3/0.4 Vamos lá! Vá em Data/Talkactions/Scripts e crie um arquivo.lua chamado quest_log.lua e adicione o script: ---------------- QUEST LOG BY YAN18 ----------------- -- NOME DA QUEST NO ÍNDICE, O NÍVEL E STORAGE NO VALOR -- local quests = { ["Cerulean City"] = {level = 30, storage = 32500}, ["Fire Stone"] = {level = 50, storage = 32501}, ["Boost Machine"] = {level = 100, storage = 32502} } function onSay(cid, words, param) local quest_completada = "- Quests completadas: \n\n" local quest_incompleta = "\n- Quests não completadas: \n\n" for i, _ in pairs (quests) do if (getPlayerLevel(cid) >= quests[i].level) and (getPlayerStorageValue(cid, quests[i].storage) < 1) then quest_incompleta = quest_incompleta .. "* " ..i.. " - Nível: " ..quests[i].level.. " \n" elseif (getPlayerLevel(cid) >= quests[i].level) and (getPlayerStorageValue(cid, quests[i].storage) >= 1) then quest_completada = quest_completada .."* " ..i.. " - Nível: " ..quests[i].level.. " \n" end end if quest_completada == "- Quests completadas: \n\n" then quest_completada = quest_completada .. " Nenhuma quest foi completada ainda. \n\n" elseif quest_incompleta == "\n- Quests não completadas: \n\n" then quest_incompleta = quest_incompleta .. " Todas as quests foram completadas." end local quest = quest_completada .. quest_incompleta return doShowTextDialog(cid, 1811, quest) end Agora abra o talkactions.xml que fica em Data/Talkactions/talkctions.xml e adicione a tag: <talkaction words="!quest" event="script" value="quest_log.lua"/> Deixei o comando !quest ali em words na tag xml, mas você pode colocar outro comando de sua preferência. Explicação: Adicione todas as quests do servidor na tabela quests, colocando o nome dela como índice, o level e storage (preste bem atenção para colocar a storage correta) como valores. Em caso de dúvidas, só seguir o exemplo que fiz. Também fiz verificação para ver se todas as quests do jogo (que você colocar na tabela) foram feitas ou não, e também fiz verificação de nível do jogador por quest, ou seja, os jogadores só verão as quests que eles tem nível para fazer. De resto não tem muito o que mexer, só se quiser reduzir ou aumentar a quantidade de espaço entre as linhas, mas ai é da preferência de cada um. Caso queira retirar a verificação de nível do jogador (pare verem todas as quests) só mudar isso: for i, _ in pairs (quests) do if (getPlayerLevel(cid) >= quests[i].level) and (getPlayerStorageValue(cid, quests[i].storage) < 1) then quest_incompleta = quest_incompleta .. "* " ..i.. " - Nível: " ..quests[i].level.. " \n" elseif (getPlayerLevel(cid) >= quests[i].level) and (getPlayerStorageValue(cid, quests[i].storage) > 1) quest_completada = quest_completada .."* " ..i.. " - Nível: " ..quests[i].level.. " \n" end end Para isso: for i, _ in pairs (quests) do if getPlayerStorageValue(cid, quests[i].storage) < 1 then quest_incompleta = quest_incompleta .. "* " ..i.. " - Nível: " ..quests[i].level.. " \n" else quest_completada = quest_completada .."* " ..i.. " - Nível: " ..quests[i].level.. " \n" end end Se fizer tudo corretamente, é para aparecer essa janela com as informações e nível da(s) quest(s): Essa janela é criada na função doShowTextDialog, e o segundo parâmetro dela é um item que aparece como ícone, geralmente deixam 0 (e recomendo deixar 0 como padrão), mas tem base que o id do item 0 aparece como algum item do jogo (as vezes montanhas ou outros itens de ambiente), então deixei um blackboard, até para ficar mais coerente hehe. Você também pode criar um item para representar essa janela, mas vai da preferência e criatividade de cada um. Se você tiver source, pode até criar uma janela com título de "Quests" para ficar mais bonito a interface, mas vai de cada um. OBS: Em alguns servidores pode ser que dê crash na distro por conta do item passado no segundo parâmetro da função doShowTextDialog(cid, id_item, texto), precisa ficar atento nisso. Qualquer dúvida só perguntar! Abraços e fiquem com Deus!
  15. Não tem sentido o título do seu tópico, não tem haver com empilhamento. Tem que ver se está atribuindo corretamente o unique id na câmera pelo setAttributeItem.
  16. Vamos lá! Primeiramente, vai em Data/NPC e crie um arquivo xml chamado Tasker.xml (ou nome de sua preferência) e adicione o script dentro: <?xml version="1.0" encoding="UTF-8"?> <npc name="Tasker" script="Tasker.lua" walkinterval="0" floorchange="0"> <health now="150" max="150"/> <look type="1419" head="10" body="15" legs="20" feet="25"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|, I need a service... Say {task} to more informations."/> </parameters> </npc> Lembrando que se dar crash é por conta do looktype do npc que você não deve ter no seu server, só trocar. Agora em Data/NPC/Scripts crie um arquivo chamado Tasker.lua e adicione o código dentro: 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 -- VARIÁVEIS -- local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid msg = string.lower(msg) local id_item = 2160 -- ITEM QUE VAI GANHAR AO CONCLUIR A TASK local quantidade_item = 1 -- QUANTIDADE DE ITENS QUE VAI GANHAR local exp = 500000 -- EXPERIÊNCIA QUE VAI GANHAR local monstro = "Magmar" -- NOME DO MONSTRO local quantidade_monstro = 50 -- QUANTIDADE DE MONSTROS (TEM QUE SER A MESMA DO CREATURESCRIPTS E NÃO PODE MUDAR O VALOR APÓS COMEÇAR A TASK) local storage = 32500 -- STORAGE DO NPC local storage_npc = 34900 -- STORAGE PARA COMEÇAR A TASK local storage_quantidade = 32510 -- STORAGE QUE ARMAZENA A QUANTIDADE DE MONSTROS DERROTADOS DA TASK. local storage_task = 32600 -- STORAGE DE CONCLUSÃO DA TASK local storage_mensagem = 32505 -- STORAGE PARA DEIXAR O DIALOGO MAIS BONITO local restante = (quantidade_monstro - getPlayerStorageValue(cid, storage_quantidade)) ----------------------------------- [ DIALOGO COM NPC] --------------------------------- if msgcontains(msg, 'task') then if getPlayerStorageValue(cid, storage) == 1 then selfSay("You have already done my task.", cid) talkState[talkUser] = 0 return true else if getPlayerStorageValue(cid, storage_npc) < 1 then selfSay("I need you kill " ..quantidade_monstro.. " " ..monstro.. ". Do you accept my task?", cid) else selfSay("Have you already finished my task?", cid) end talkState[talkUser] = 1 return true end elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then if getPlayerStorageValue(cid, storage_mensagem) < 1 and getPlayerStorageValue(cid, storage_npc) < 1 then selfSay("Ok, go to complete my task.", cid) talkState[talkUser] = 0 setPlayerStorageValue(cid, storage_mensagem, 1) setPlayerStorageValue(cid, storage_npc, 1) setPlayerStorageValue(cid, storage_quantidade, 0) return true end if getPlayerStorageValue(cid, storage_task) < 1 then selfSay("You don't finish my task yet. You need to kill " ..restante.. " " ..monstro.. " yet." , cid) talkState[talkUser] = 0 return true else selfSay("Congratulations! You finished my task! Receive your reward.", cid) doSendMagicEffect(getThingPos(cid), 27) doPlayerAddExp(cid, exp) doPlayerAddItem(cid, id_item, quantidade_item) setPlayerStorageValue(cid, storage, 1) talkState[talkUser] = 0 return true end end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Explicação: Precisa prestar bastante atenção nessa parte e na próxima, são detalhes que fazem a diferença e qualquer coisa já da problema. Recomendo que deixe essas storages caso não use, até porque usa bastante e pode te confundir na hora de trocar. Mas como comentei todas, da para saber qual é qual. Agora vai em Data/Creaturescripts/Scripts e crie o arquivo Tasker.lua e adicione o script: local monstro = "Magmar" -- NOME DO MONSTRO (VERIFICAR A NOMENCLATURA CORRETA NO ARQUIVO XML DO MONSTRO, SE COMEÇA COM MINÚSCULA OU MAIÚSCULA) local quantidade = 50 -- QUANTIDADE DE MONSTROS (MESMA QUANTIDADE DO SCRIPT DO NPC) local storage_npc = 34900 -- STORAGE QUE O NPC LIBERA A TASK PARA FAZER local storage_quantidade = 32510 -- STORAGE PARA CONTABILIZAR (CONTADOR) OS MONSTROS DERROTADOS local storage_task = 32600 -- STORAGE QUE VERIFICA SE A TASK JÁ FOI CONCLUIDA local nome_npc = "Tasker" -- NOME DO NPC AQUI function onKill(cid, target, lasthit) if getPlayerStorageValue(cid, storage_task) < 1 then if (getPlayerStorageValue(cid, storage_npc) > 0) and (getPlayerStorageValue(cid, storage_quantidade) < quantidade) then if isCreature(target) and getCreatureName(target) == monstro then setPlayerStorageValue(cid, storage_quantidade, getPlayerStorageValue(cid, storage_quantidade) + 1) local restante = quantidade - getPlayerStorageValue(cid, storage_quantidade) if restante > 1 then doPlayerSendTextMessage(cid, 27, nome_npc.. ": " ..restante.. " " ..monstro.. " restantes para derrotar.") return true elseif restante == 1 then doPlayerSendTextMessage(cid, 27, nome_npc.. ": " ..restante.. " " ..monstro.. " restante para derrotar.") return true elseif restante == 0 then doPlayerSendTextMessage(cid, 27, nome_npc.. ": Não há mais " ..monstro.. " para derrotar. Você já pode vir pegar sua recompensa!") setPlayerStorageValue(cid, storage_task, 1) return true end else return true end else return true end else return true end end Agora abra o creaturescripts.xml e adicione a tag: <event type="kill" name="Tasker" event="script" value="Tasker.lua"/> E por fim, abra o arquivo Data/Creaturescripts/Scripts/login.lua e registre o evento (de preferência por último) : registerCreatureEvent(cid, "Tasker") Lembrando que o nome do evento registrado tem que ser o mesmo que está na tag xml. E cuidado com o nome do monstro que coloca, alguns podem começar com letra minúscula ou maiúscula, e se tiver diferente, uma letra que seja em tamanho, já vai dar errado. Então precisa olhar no xml do monstro. Eu testei e funcionou, qualquer problema só falar.
  17. Acontece, tibia é tudo nos mínimos detalhes rsrs. Mas, você fala aqui no post? É melhor eleger como melhor resposta o post que postei o código, porque assim quem precisar futuramente já identifica facilmente.
  18. De nada, que isso! Você tinha esquecido de salvar o script que fiz?
  19. Eu vi o vídeo, mas você não está usando o script que eu fiz, pois quando usou a potion nem apareceu a mensagem que coloquei. Tirei até uma print do teste que fiz novamente aqui, olha como cura o tanto que eu coloco e exibe a mensagem;
  20. Está healando tudo se não mudou o valor ali do hp que falei, deixei 50000 só de teste, pode ser que os monstros que está usando a potion tenham menos de 50000 de vida. Eu testei aqui e está curando pelo tanto que você define.
  • Quem Está Navegando   0 membros estão online

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