lepiigor 16 #1 Postado 23 Março, 2021 Olá Hoje vou compartilhar o único sistema de Custom Task que consegui fazer funcionar no servidor, todo mundo que toca no Sources dá muito erro (talvez porque fiquei no 12.60, mas acho que não).) . O NPC SÓ FUNCIONA PARA 1 TAREFA, então se você quiser 20 tarefas, serão 20 NPC .. Infelizmente não consigo fazer funcionar para vários monstros e tarefas ao mesmo tempo, se você souber como fazê-lo, por favor faça então. compartilhe! 1- Nós criamos um NPC, aquele que você quer que você copie e cole o XML, você muda o nome, e necessariamente o nome do npc.lua você muda também. Vá em Npc / Scripts, e do mesmo jeito que você copia e cola qualquer NPC, você o renomeia com o mesmo nome do NPC do XML e cola este: 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 local storage = 6230 function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if msgcontains(msg, "mission") then if getPlayerStorageValue(cid, storage) == -1 then selfSay("I have a mission for you to kill 400 Hellhounds and 400 Hellfire Fighters do you accept?", cid) talkState[talkUser] = 1 elseif getPlayerStorageValue(cid, storage) == 1 then selfSay("Did you kill 400 Hellhounds and 400 Hellfire Fighters?", cid) talkState[talkUser] = 1 else selfSay("You already did the mission, you can do it only one time.", cid) end elseif msgcontains(msg, "yes") and talkState[talkUser] == 1 then if getPlayerStorageValue(cid, storage) == -1 then selfSay("Good, come back when you killed them.", cid) setPlayerStorageValue(cid, storage, 1) else if getPlayerStorageValue(cid, 38118) == 400 and getPlayerStorageValue(cid, 38119) == 400 then selfSay("Good job, here is your reward.", cid) doPlayerAddItem(cid, 2160, 10) doPlayerAddItem(cid, 5919, 1) doPlayerAddItem(cid, 5925, 100) doPlayerAddItem(cid, 5899, 100) doPlayerAddItem(cid, 5884, 1) doPlayerAddExp(cid, 15000000) setPlayerStorageValue(cid, storage, 2) else selfSay("You didn't kill them all.", cid) end end talkState[talkUser] = 0 elseif msgcontains(msg, "no") and talkState[talkUser] == 1 then selfSay("Ok then.", cid) talkState[talkUser] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) - local storage = 6230 : Então aqui é muito fácil, se você vai criar 50 NPCs, onde está escrito: local storage = 6230 (este é ostorage do NPC, 1 diferente por NPC!), voce pode empezar por 825000 o numero muy alto - if getPlayerStorageValue(cid, 38118) == 400 and getPlayerStorageValue(cid, 38119) == 400 then : importante aqui, o 38118 corresponde ao armazenamento de 1 monstro (no script a seguir), o == 400, corresponde ao número de 400 monstros, o próximo o mesmo, 38119 ao armazenamento do monstro necessário (segundo monstro) para a tarefa, bem como == 400, 400 monstros também, no exemplo, 400 lutador do inferno e 400 cães do inferno. Abaixo: doplayerAdditem, você sabe o que é, é o ID do item que você dará para a tarefa seguido de uma vírgula, com o número (quantidade) que você dará. identico para doPlayerAddExp. - Não exclua setPlayerStorageValue (cid, storag, 2), caso contrário, depois de concluído, os jogadores poderão solicitar recompensas infinitas, a tarefa não pode ser repetida, a menos que você altere o armazenamento. Codigo siguiente: Em data / script / Creaturescript, crie uma nova pasta com o nome de Task por exemplo, copie uma lua aleatória para ela, apenas para manter a extensão lua. Copie este código para dentro. local hellhoundsKill = CreatureEvent("hellhoundsKill") local config = { ['hellhound'] = {amount = 400, storage = 38118, startstorage = 6230, startvalue = 1}, ['hellfire fighter'] = {amount = 400, storage = 38119, startstorage = 6230, startvalue = 1} } function hellhoundsKill.onKill(cid, target) local monster = config[getCreatureName(target):lower()] if isPlayer(target) or not monster or isSummon(target) then return true end if (getPlayerStorageValue(cid, monster.storage)+1) < monster.amount and getPlayerStorageValue(cid, monster.startstorage) >= monster.startvalue then setPlayerStorageValue(cid, monster.storage, getPlayerStorageValue(cid, monster.storage) + 1) doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, '[Task message]: '..(getPlayerStorageValue(cid, monster.storage)+1)..' of '..monster.amount..' '..getCreatureName(target)..'s killed.') end if (getPlayerStorageValue(cid, monster.storage)+1) == monster.amount then doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, 'Congratulations, you have killed '..(getPlayerStorageValue(cid, monster.storage)+1)..' '..getCreatureName(target)..'s and completed the '..getCreatureName(target)..'s mission.') setPlayerStorageValue(cid, monster.storage, getPlayerStorageValue(cid, monster.storage) + 1) end return true end hellhoundsKill:register() - Importante aqui onde você escreve hellhoundsKill, é o nome a ser alterado cada vez que você cria uma tarefa npc, no exemplo é hellhoundsKill, então você pode nomeá-lo como quiser, mas você deve substituí-lo em 4 campos, dê uma boa olhada em o script. -Temos 'hellhound' e número para matar 400, o storage como mencionado acima, 38118 e o startstorage é o storage que corresponde ao NPC que dá a tarefa, importante que seja idêntico, abaixo do mesmo, hellfire figther, 400, storage 38119 e 6230 para o mesmo npc. - Aqui você também pode modificar, MESSAGE_EVENT_ADVANCE, que corresponde ao texto na cor branca cada vez que ele matar 1 monstro, você pode colocar WARNING que estará em VERMELHO, ou então excluí-lo e escrever em número como este: (cid, 22, '[Mensagem de tarefa]' ... etc Procure o login.lua e abaixo: se player: if player:getLastLoginSaved() == 0 then player:sendOutfitWindow() local backpack = player:addItem(1988) if backpack then for i = 1, #items do backpack:addItem(items[i][1], items[i][2]) end end player:addItem(2050, 1, true, 1, CONST_SLOT_AMMO) else outro Copie isso (acima do armazenamento da missão) player:registerEvent("hellhoundsKill") - Aqui você deve colocar o mesmo nome do script acima, se você o chamou de DemonKILL, você deve escrever demonKill, no exemplo que estávamos com HellhoundsKill. Leva EFFECT imediatamente, se você fizer / recarregar scripts Npc / recarregar, mas tenha cuidado !!! No login.lua, você tem que se desconectar e voltar para que tenha efeito, se não fizer o logout e matar um monstro, o servidor provavelmente irá CRASH, o melhor e reiniciará ou se você estiver sozinho antes de colocar on-line para testá-los todos. Estou com 72 NPCs hoje e irei adicionar mais 30 para todos os chefes existentes, até agora sem problemas. Se você tiver alguma dúvida, não hesite em PM 1 Majesty reagiu a isto Compartilhar este post Link para o post
Majesty 1755 #2 Postado 23 Março, 2021 Muito obrigado pela sua contribuição, seu conteúdo foi aprovado!Nós do OTServ Brasil agradecemos, seu conteúdo com certeza ajudará a muitos outros. Você recebeu +1 REP! Compartilhar este post Link para o post