Postado Abril 5, 2023 2 anos [Quest System] Estava ontem analisando minha base, aonde tinha várias quests em arquivos separados. Spoiler Então, pq não organizar tudo em apenas um arquivo exemplo: Spoiler config = { -- Quest com prêmio apenas em pokemon [13123] = { monster = "Charizard", quantidade = 1, item = 2160, level = 5, storage = 33333 }, -- Quest com prêmio apenas em item [65535] = { monster = "", item = 2160, quantidade = 1, level = 5, storage = 33334 } } Então fiz esse script, meio simples mas útil para organizar tudo. Spoiler dentro de servidor/data/action/script crie um arquivo chamado quest: Spoiler function onUse(cid, item, frompos, item2, topos) local match_found = false -- inicializa variável booleana para indicar correspondência encontrada for k, v in pairs(quest) do if item.actionid == k then match_found = true -- define variável como true se encontrar correspondência if v.level <= getPlayerLevel(cid) then if v.monster ~= "" then if getPlayerStorageValue(cid, v.storage) == -1 then doPlayerSendTextMessage(cid, 25, "Voce ganhou: " .. v.monster .. "") addPokeToPlayer(cid, v.monster, v.boost, "normal") -- comentado porque a função não está definida --addPokeToPlayer(cid, pokemon, boost, ball) doPlayerAddItem(cid, v.item, v.quantidade) setPlayerStorageValue(cid, v.storage , 1) else doPlayerSendTextMessage(cid, 25, "Voce já fez essa quest") end else if getPlayerStorageValue(cid, v.storage) == -1 then doPlayerAddItem(cid, v.item, v.quantidade) setPlayerStorageValue(cid, v.storage , 1) doPlayerSendTextMessage(cid, 25, "Voce ganhou itens") else doPlayerSendTextMessage(cid, 25, "Voce já fez essa quest") end end else doPlayerSendTextMessage(cid, 25, "Voce nao tem nivel suficiente\n[Nivel necessario:" .. v.level .. "]\n") end end end if not match_found then -- executa se não encontrar nenhuma correspondência doPlayerSendTextMessage(cid, 25, "Esse bau não está configurado para uma quest.") end end agora em servidor/data/action.xml Spoiler <action actionid="13123;65535" event="script" value="quest.lua"/> agora vá em servidor/data/lib crie um arquivo chamado config.lua e adicione isso lá dentro Spoiler quest = { -- POKEMONS INICIAIS [3336] = { monster = "Charmander", item = 2159, quantidade = 1, level = 1, boost = 5, storage = 33335 }, [3337] = { monster = "Squirtle", item = 2159, quantidade = 1, level = 1, boost = 5, storage = 33335 }, [3338] = { monster = "Bulbasaur", item = 2159, quantidade = 1, level = 1, boost = 5, storage = 33335 } } Agora vamos entender oq precisamos fazer! Spoiler [65535] = { monster = "", item = 2160, quantidade = 1, level = 5, storage = 33334 } [action id] = o id que colocará dentro do báu [monster = ""] deixe assim, se não quiser mostro apenas item, mas se quiser coloque dentro o nome [level] level necessário para fazer [storage] que armazenará que voce ja fez ou não fez a quest Uma pequena atualização, agora fica em um lugar separado a configuração para ficar mais fácil modificar. Agora pode adicionar o boost que voce deseja no pokemon. Bem é isso. Editado Abril 8, 2023 2 anos por PokemonXdemon (veja o histórico de edições)
Postado Abril 6, 2023 2 anos Ótimo conteúdo, obrigado pela contribuição, apenas alguns adendos que podem melhorar o seu código. vc fez um for k, v in pairs(config) do esse for não tem nenhuma condição de parada, porém com 10-15 quests ele executará bem rapido, correto? mas imaginemos um cenário de 100 players clicando no mesmo bau ou outros ao mesmo tempo, ainda assim mesmo não lagando, ele irá fazer checagens desnecessárias. vc pode trocar o for por local questId = config[item.actionid] if questId then --código aqui else -- foi clicado no bau chamado um aid que não existe na config end apartir dai o resto do código já trabalha normal, mas ao invés de usar o K e V do for como params, vc já pode usar o questId. questId.monster / questId.storage .... seria menos checagems, e o questId ja retornaria exatamente o ID da config pra otimizar mais o processo
Postado Abril 6, 2023 2 anos Autor 35 minutos atrás, FeeTads disse: Ótimo conteúdo, obrigado pela contribuição, apenas alguns adendos que podem melhorar o seu código. vc fez um for k, v in pairs(config) do esse for não tem nenhuma condição de parada, porém com 10-15 quests ele executará bem rapido, correto? mas imaginemos um cenário de 100 players clicando no mesmo bau ou outros ao mesmo tempo, ainda assim mesmo não lagando, ele irá fazer checagens desnecessárias. vc pode trocar o for por local questId = config[item.actionid] if questId then --código aqui else -- foi clicado no bau chamado um aid que não existe na config end apartir dai o resto do código já trabalha normal, mas ao invés de usar o K e V do for como params, vc já pode usar o questId. questId.monster / questId.storage .... seria menos checagems, e o questId ja retornaria exatamente o ID da config pra otimizar mais o processo Obrigado, futuramente faço outra atualização. Fiz algumas modificações antes a config ficava dentro do script, agora ele fica separado para ficar mais fácil configurar exemplo Spoiler
Postado Abril 6, 2023 2 anos 4 minutos atrás, PokemonXdemon disse: para ficar mais fácil configurar exemplo boa, indico vc fazer o item, ser "reward" e fazer se uma table, pq futuramente vc pode querer entregar mais de 1 item na mesma quest. reward = {{item, qtd}, {item, qtd}}, ai vc indexa com for i=1, #quest.reward do doPlayerAddItem(cid, questId.reward[i][1], questId.reward[i][2]) -- [i][1] = index i, valor 1 (item), [i][2] = index i, valor 2 (qtd) end ja seria um upgrade a mais no script, seria bom sempre fazer a checagem se o item é stackavel ou não tbm, caso n seja stackavel e a QTD seja maior que 1, do "doPlayerAddItem" não adiciona mais que 1 item não stackavel, da pra fazer um função pra isso, ou fazer assim: for i=1, #quest.reward do if not isItemStackable(questId.reward[i][1]) and questId.reward[i][2] > 1 then -- caso o item não seja stackavel e a QTD > 1 for j=1, questId.reward[i][2] do -- vai de 1 a QTD doPlayerAddItem(cid, questId.reward[i][1], 1) -- adicionando o item pro player end else doPlayerAddItem(cid, questId.reward[i][1], questId.reward[i][2]) -- [i][1] = index i, valor 1 (item), [i][2] = index i, valor 2 (qtd) end end da pra fazer disso uma função pra no futuro chamar de qualquer script ao inves de sempre faze-la.
Postado Abril 6, 2023 2 anos Autor 1 hora atrás, FeeTads disse: boa, indico vc fazer o item, ser "reward" e fazer se uma table, pq futuramente vc pode querer entregar mais de 1 item na mesma quest. reward = {{item, qtd}, {item, qtd}}, ai vc indexa com for i=1, #quest.reward do doPlayerAddItem(cid, questId.reward[i][1], questId.reward[i][2]) -- [i][1] = index i, valor 1 (item), [i][2] = index i, valor 2 (qtd) end ja seria um upgrade a mais no script, seria bom sempre fazer a checagem se o item é stackavel ou não tbm, caso n seja stackavel e a QTD seja maior que 1, do "doPlayerAddItem" não adiciona mais que 1 item não stackavel, da pra fazer um função pra isso, ou fazer assim: for i=1, #quest.reward do if not isItemStackable(questId.reward[i][1]) and questId.reward[i][2] > 1 then -- caso o item não seja stackavel e a QTD > 1 for j=1, questId.reward[i][2] do -- vai de 1 a QTD doPlayerAddItem(cid, questId.reward[i][1], 1) -- adicionando o item pro player end else doPlayerAddItem(cid, questId.reward[i][1], questId.reward[i][2]) -- [i][1] = index i, valor 1 (item), [i][2] = index i, valor 2 (qtd) end end da pra fazer disso uma função pra no futuro chamar de qualquer script ao inves de sempre faze-la. gostei da ideia, vou anotar futuramente fazer essas mudanças.
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.