Ir para conteúdo
Propaganda

Npc Otimização


eduardogaier

Posts Recomendados

Opa estou criando esse npc onde ele me dara 5 missoes para fazer, é atualizado no questlog, é claro que cada missao libera a proxima, estou meio perdido na separação das missoes e to achando o codigo muito grande com muitas checagens de storage, se alguem puder dar uma olhada e me dar laguma dica de como otimizar agradeço.

local internalNpcName = "Wagner"
local npcType = Game.createNpcType(internalNpcName)
local npcConfig = {}

npcConfig.name = internalNpcName
npcConfig.description = internalNpcName
 
npcConfig.health = 100
npcConfig.maxHealth = npcConfig.health
npcConfig.walkInterval = 1000
npcConfig.walkRadius = 2
 
npcConfig.outfit = {
    lookType = 432,
    lookHead = 114,
    lookBody = 0,
    lookLegs = 114,
    lookFeet = 0,
    lookAddons = 3
}
 
npcConfig.flags = {
    floorchange = false
}
 --- Mensagens automaticas que seram ditas sem a interação
npcConfig.voices = {
    interval = 15000,
    chance = 50,
    { text = 'Sentindo-se perdido, meu filho? Peça-me dicas ou ajuda!' },
    { text = 'Sou o cidadão Mais antigo de todos!' },
    { text = 'Bem-vindo a cidade de RookLand!' },
    { text = 'Vendo Backpack de UH venha conferir!' }
}
 
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
 
npcType.onThink = function(npc, interval)
    npcHandler:onThink(npc, interval)
end
 
npcType.onAppear = function(npc, creature)
    npcHandler:onAppear(npc, creature)
end
 
npcType.onDisappear = function(npc, creature)
    npcHandler:onDisappear(npc, creature)
end
 
npcType.onMove = function(npc, creature, fromPosition, toPosition)
    npcHandler:onMove(npc, creature, fromPosition, toPosition)
end
 
npcType.onSay = function(npc, creature, type, message)
    npcHandler:onSay(npc, creature, type, message)
end
 
npcType.onCloseChannel = function(npc, creature)
    npcHandler:onCloseChannel(npc, creature)
end
 
local topic = {}
local renown = {}
 
local function creatureSayCallback(npc, creature, type, message)
    local player = Player(creature)
    local playerId = player:getId()
 
    if not npcHandler:checkInteraction(npc, creature) then
        return false
    end
 
    if MsgContains(message, 'no') or MsgContains(message, 'não') then
        npcHandler:say('Ok, até a próxima.', npc, creature)
        npcHandler:removeInteraction(npc, creature)
        npcHandler:resetNpc(creature)
    elseif MsgContains(message, 'trabalho') then
        if player:getStorageValue(60163) == -1 then
            npcHandler:say('Ok, Anderson o Alquimista está me devendo 5 blank Runes, você poderia buscar para mim? {yes} ou {no}', npc, creature)
            topic[playerId] = 1
        elseif player:getStorageValue(60163) == 1 then
            npcHandler:say('Você já está participando da missão. Lembre-se de trazer as runas. {Entregar}', npc, creature)
        elseif player:getStorageValue(60164) == 2 then
            npcHandler:say('Iai trouxe as runas ? {Entregar}', npc, creature)
        end
    elseif topic[playerId] == 1 and (MsgContains(message, 'yes') or MsgContains(message, 'sim')) then
        npcHandler:say('Ótimo! Vá até a saída sul esquerda da cidade e fale com o Anderson e me traga as Blank Runes.', npc, creature)
        player:setStorageValue(60163, 1)
        player:setStorageValue(60164, 1)
        npcHandler:removeInteraction(npc, creature)
        npcHandler:resetNpc(creature)
    elseif MsgContains(message, 'Entregar') then
        if player:getItemCount(3147) >= 5 then
            if player:getStorageValue(60164) == 2 then
                npcHandler:say('Você me trouxe as runas? {yes} ou {no}', npc, creature)
                topic[playerId] = 2
            else
                npcHandler:say('Volte lá e me traga as runas logo.', npc, creature)
                npcHandler:removeInteraction(npc, creature)
                npcHandler:resetNpc(creature)
            end
        else
            npcHandler:say('Volte lá e me traga as runas logo.', npc, creature)
            npcHandler:removeInteraction(npc, creature)
            npcHandler:resetNpc(creature)
        end
    end
   
    if topic[playerId] == 2 and (MsgContains(message, 'yes') or MsgContains(message, 'sim')) then
        if player:removeItem(3147, 5) then
            npcHandler:say('Parabéns! Você concluiu seu primeiro trabalho. Aqui está sua recompensa.', npc, creature)
            -- entrega os itens e já dá a xp, não precisa de mais nada além disso
            player:addExperience(500, true)
            player:setStorageValue(60164, 3)
        else
            npcHandler:say('Você não possui os itens necessários.', npc, creature)
        end
        npcHandler:removeInteraction(npc, creature)
        npcHandler:resetNpc(creature)
    elseif player:getStorageValue(60164) == 3 and topic[playerId] ~= 2 then
        npcHandler:say('Você já concluiu esta missão. Vamos para a missão {mission2} ?', npc, creature)
        topic[playerId] = 3
    end
   
    if topic[playerId] == 3 and (MsgContains(message, 'yes') or MsgContains(message, 'sim')) then
        if player:getStorageValue(60164) == 3 then
            npcHandler:say('Você já concluiu esta missão. Vamos para a missão {mission2} ?', npc, creature)
            topic[playerId] = 4
        else
            npcHandler:say('Você já concluiu esta missão. O que você quer fazer agora?', npc, creature)
            npcHandler:removeInteraction(npc, creature)
            npcHandler:resetNpc(creature)
        end
    end
 
    if topic[playerId] == 4 and MsgContains(message, 'mission2') then
        if player:getStorageValue(60164) == 3 then
            if player:getStorageValue(60165) == 1 then
                npcHandler:say('Ok, pegue esta foice e corte 5 trigos.', npc, creature)
                player:setStorageValue(60165, 2)
            else
                npcHandler:say('Você já pegou a foice. Vá cortar os trigos!', npc, creature)
            end
        else
            npcHandler:say('Você já concluiu esta missão. O que você quer fazer agora?', npc, creature)
        end
        npcHandler:removeInteraction(npc, creature)
        npcHandler:resetNpc(creature)
    end
 
    return true
end
 
local function onReleaseFocus(npc, creature)
    local playerId = creature:getId()
    topic[playerId], renown[playerId] = nil, nil
end
 
keywordHandler:addKeyword({'informação'}, StdModule.say, {npcHandler = npcHandler, text = 'A ok eu gosto de ser objetivo tenho alguns tópicos que talvez te interessar como:\n {minha vida} \n{rookland} \n{missões}.'})
keywordHandler:addKeyword({'minha vida'}, StdModule.say, {npcHandler = npcHandler, text = 'Eu sempre fiquei na frente do DP runando UH, para vender para outros guerreiros, não fiquei rico, mas consegui me manter por um tempo.\n Assim adquiri muito conhecimento da cidade e conheci muitas pessoas, por isso pode me perguntar qualquer coisa que poderei te ajudar.\n só não me peça para fazer LMMs que tenho uma péssima lembrança sobre isso, consegui chegar apenas até o nível 24, mas quem sabe posso te ajudar a alcançar este nível também! {informação} '})
keywordHandler:addKeyword({'rookland'}, StdModule.say, {npcHandler = npcHandler, text = 'Rookland é um pequeno vilarejo de fazendeiros, onde há inúmeras possibilidades de trabalhos e missões, onde você pode provar o seu valor, ter sua casa, sua plantação e se tornar um ótimo Guerreiro, Druida, Sorcerer, Paladino ou até mesmo um arqueiro, logo te darei mais informações, no momento estou meio ocupado, tenho que entregar algumas UHSS.'})
keywordHandler:addKeyword({'missões'}, StdModule.say, {npcHandler = npcHandler, text = 'Humm!  você veio da batalha e não tem nada, mas eu posso arranjar algum trabalho para você se reerguer, porem não sairá de graça. Você aceita o {trabalho} ?'})
 
npcHandler:setMessage(MESSAGE_GREET, 'Olá |PLAYERNAME|, Olá eu posso te ajudar com alguma, {informação} ?')
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:setCallback(CALLBACK_REMOVE_INTERACTION, onReleaseFocus)
npcHandler:addModule(FocusModule:new(), npcConfig.name, true, true, true)
 
-- npcType registering the npcConfig table
npcType:register(npcConfig)

 

 

 
  • Like 12
  • Thanks 1
Link para o comentário
Compartilhar em outros sites

local internalNpcName = "Wagner"

local npcConfig = {
    name = internalNpcName,
    description = internalNpcName,
    health = 100,
    maxHealth = 100,
    walkInterval = 1000,
    walkRadius = 2,
    outfit = {
        lookType = 432,
        lookHead = 114,
        lookBody = 0,
        lookLegs = 114,
        lookFeet = 0,
        lookAddons = 3
    },
    flags = {
        floorchange = false
    },
    voices = {
        interval = 15000,
        chance = 50,
        { text = 'Sentindo-se perdido, meu filho? Peça-me dicas ou ajuda!' },
        { text = 'Sou o cidadão Mais antigo de todos!' },
        { text = 'Bem-vindo a cidade de RookLand!' },
        { text = 'Vendo Backpack de UH venha conferir!' }
    }
}

local function onReleaseFocus(npc, creature)
    local playerId = creature:getId()
    topic[playerId], renown[playerId] = nil, nil
end

local function workMessage(player)
    if player:getStorageValue(60164) == 3 then
        return ''
    end
    return ' Ok, Anderson o Alquimista está me devendo 5 blank Runes, você poderia buscar para mim? {yes} ou {no}'
end

local function doWork(npcHandler, text, topic, playerId, work)
    if topic[playerId] == 1 and (MsgContains(text, 'yes') or MsgContains(text, 'sim')) then
        npcHandler:say('Ótimo! Vá até a saída sul esquerda da cidade e fale com o Anderson e me traga as Blank Runes.', npc, creature)
        player:setStorageValue(60163, 1)
        player:setStorageValue(60164, 1)
        npcHandler:resetNpc(creature)
    elseif MsgContains(text, 'Entregar') then
        if player:getItemCount(3147) >= 5 then
            if player:getStorageValue(60164) == 2 then
                npcHandler:say('Você me trouxe as runas? {yes} ou {no}', npc, creature)
                topic[playerId] = 2
            else
                npcHandler:say('Volte lá e me traga as runas logo.', npc, creature)
                npcHandler:resetNpc(creature)
            end
        else
            npcHandler:say('Volte lá e me traga as runas logo.', npc, creature)
            npcHandler:resetNpc(creature)
        end
    end
end

local function doSecondMission(npcHandler, text, topic, playerId)
    if topic[playerId] == 2 and (MsgContains(text, 'yes') or MsgContains(text, 'sim')) then
        if player:removeItem(3147, 5) then
            npcHandler:say('Parabéns! Você concluiu seu primeiro trabalho. Aqui está sua recompensa.', npc, creature)
            player:addExperience(500, true)
            player:setStorageValue(60164, 3)
        else
            npcHandler:say('Você não possui os itens necessários.', npc, creature)
        end
        npcHandler:resetNpc(creature)
    elseif player:getStorageValue(60164) == 3 and topic[playerId] ~= 2 then
        npcHandler:say('Você já concluiu esta missão. Vamos para a missão {mission2} ?', npc, creature)
        topic[playerId] = 3
    end
end

local function doThirdMission(npcHandler, text, topic, playerId)
    if topic[playerId] == 3 and (MsgContains(text, 'yes') or MsgContains(text, 'sim')) then
        if player:getStorageValue(60164) == 3 then
            npcHandler:say('Você já concluiu esta missão. Vamos para a missão {mission2} ?', npc, creature)
            topic[playerId] = 4
        else
            npcHandler:say('Você já concluiu esta missão. O que você quer fazer agora?', npc, creature)
            npcHandler:resetNpc(creature)
        end
    end
end

local function doFourthMission(npcHandler, text, topic, playerId)
    if topic[playerId] == 4 and MsgContains(text, 'mission2') then
        if player:getStorageValue(60164) == 3 then
            if player:getStorageValue(60165) == 1 then
                npcHandler:say('Ok, pegue esta foice e corte 5 trigos.', npc, creature)
                player:setStorageValue(60165, 2)
            else
                npcHandler:say('Você já pegou a foice. Vá cortar os trigos!', npc, creature)
            end
        else
            npcHandler:say('Você já concluiu esta missão. O que você quer fazer agora?', npc, creature)
        end
        npcHandler:resetNpc(creature)
    end
end

local function creatureSayCallback(npc, creature, type, message)
    local player = Player(creature)
    local playerId = player:getId()

    if not npcHandler:checkInteraction(npc, creature) then
        return false
    end

    if MsgContains(message, 'no') or MsgContains(message, 'não') then
        npcHandler:say('Ok, até a próxima.', npc, creature)
        npcHandler:resetNpc(creature)
    elseif MsgContains(message, 'trabalho') then
        npcHandler:say(workMessage(player), npc, creature)
        topic[playerId] = 1
    end
    
    doWork(npcHandler, message, topic, playerId)
    doSecondMission(npcHandler, message, topic, playerId)
    doThirdMission(npcHandler, message, topic, playerId)
    doFourthMission(npcHandler, message, topic, playerId)

    return true
end

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)

keywordHandler:addKeyword({'informação'}, StdModule.say, {npcHandler = npcHandler, text = 'A ok eu gosto de ser objetivo tenho alguns tópicos que talvez te interessar como:\n {minha vida} \n{rookland} \n{missões}.'})
keywordHandler:addKeyword({'minha vida'}, StdModule.say, {npcHandler = npcHandler, text = 'Eu sempre fiquei na frente do DP runando UH, ...'})

npcHandler:setMessage(MESSAGE_GREET, 'Olá |PLAYERNAME|, Olá eu posso te ajudar com alguma, {informação} ?')
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:setCallback(CALLBACK_REMOVE_INTERACTION, onReleaseFocus)
npcHandler:addModule(FocusModule:new(), internal

This is the hidden content, please


faça o teste e veja se funciona de acordo com sua necessidade, caso não, envie uma mensagem ao chat gpt e peça para que ele faça as mudanças necessarias, abc

  • Like 5
Link para o comentário
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Cadastre-se Agora para publicar com Sua Conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

×
  • Criar Novo...