Postado Fevereiro 7, 2021 4 anos Qual o motivo deste tópico? Opa pessoal estou aqui mais uma vez para pedir um suporte! É o seguinte, estou com um npc que ele da task daily, ok, ele te da 2 opções de task, até ai normal. Da para você escolher as duas normal. O problema vem a seguir, exemplo: * Supondo que eu escolhi a Opção 1, tendo que matar 500 Rat, se o servidor cair ou reiniciar antes que eu termine os 500 Rat, o personagem buga. * O bug consiste em ficar preso na missão de 500 Rat para sempre, não tem como entregar pois o comando para entrar "reward" não funciona, e não tem como tentar começar outra task pois ele fala que você tem que terminar essa de 500 Rat primeiro. ( Tasker: Voce ja escolheu uma task hoje, termine-a primeiro. ) *Resumindo tudo: Se o player esta no meio da task, e o servidor cai ou reinicia, ele trava naquela task, não consegue entregar e nem tentar entrar em outra. Irei postar a script e xml do npc, foi modificada um pouco por mim, mas total Crédito ao: @MatteusDeli Citar <?xml version="1.0" encoding="UTF-8"?> <npc name="Tasker" script="data/npc/scripts/tasker.lua" walkinterval="2000" speed="0" floorchange="0"> <health now="100" max="100"/> <look type="10" head="19" body="113" legs="95" feet="115" addons="0"/> <parameters> <parameter key="message_greet" value="|PLAYERNAME|! Eu tenho uma tarefa para você, diga {daily} pra saber mais. Caso tenha finalizado diga {reward}." /> </parameters> </npc> Citar 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 opcao1 = nil local opcao2 = nil local pokemonNameOpcao1 = '' local pokemonNameOpcao2 = '' local opcaoSelecionada = nil function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end if msgcontains(msg, 'daily') then if (getPlayerStorageValue(cid, task_start) >= 1) then return selfSay("Voce ja escolheu uma task hoje, termine-a primeiro.") end if (getPlayerStorageValue(cid, task_storage_time) > os.time()) then return selfSay("Voce ja terminou a sua task hoje, volte amanha.") end setPlayerStorageValue(cid, task_storage_time, -1) selfSay("Diga 'monsters' para saber quais monsters estao disponiveis hoje.") talkState[cid] = 0 end if (getPlayerStorageValue(cid, task_storage_time) < os.time()) then if msgcontains(msg, 'monsters') and talkState[cid] == 0 and pokemonNameOpcao1 == '' and pokemonNameOpcao2 == '' then opcao1 = PokemonOpcao1() opcao2 = PokemonOpcao2() pokemonNameOpcao1 = opcao1.PokemonName pokemonNameOpcao2 = opcao2.PokemonName selfSay("Opcao 1: Voce tera que derrotar "..opcao1.Count.." "..opcao1.PokemonName.."(s).") selfSay("Opcao 2: Voce tera que derrotar "..opcao2.Count.." "..opcao2.PokemonName.."(s).") talkState[cid] = 1 end if msgcontains(msg, 'monsters') and talkState[cid] == 0 and pokemonNameOpcao1 ~= '' and pokemonNameOpcao2 ~= '' then selfSay("Essas sao as opcoes de monsters para voce hoje.") selfSay("Opcao 1: Voce tera que derrotar "..opcao1.Count.." "..opcao1.PokemonName.."(s).") selfSay("Opcao 2: Voce tera que derrotar "..opcao2.Count.." "..opcao2.PokemonName.."(s).") talkState[cid] = 1 end end if msgcontains(string.lower(msg), string.lower(pokemonNameOpcao1)) and talkState[cid] == 1 then opcaoSelecionada = opcao1 GetOpcaoSelecionada(cid, msg, opcao1) StorageStartTaskOpcao1 = opcao1 setPlayerStorageValue(cid, task_start_opcao1, task_info_table_opcao1) talkState[cid] = 0 end if msgcontains(string.lower(msg), string.lower(pokemonNameOpcao2)) and talkState[cid] == 1 then opcaoSelecionada = opcao2 GetOpcaoSelecionada(cid, msg, opcao2) setPlayerStorageValue(cid, task_start_opcao2, task_info_table_opcao2) talkState[cid] = 0 end if (getPlayerStorageValue(cid, task_finish) >= 1) then if (msgcontains(msg, 'reward')) then if (opcaoSelecionada ~= nil) then selfSay("Parabens voce acabou a task diaria de hoje. Voce ganhou "..opcaoSelecionada.Experience.." de experiencia e "..opcaoSelecionada.Reward..".") doPlayerAddExperience(cid, opcaoSelecionada.Experience) doPlayerAddItem(cid, opcaoSelecionada.Reward) setPlayerStorageValue(cid, task_storage_time, os.time() + (60 * 60 * task_time)) setPlayerStorageValue(cid, task_start, -1) setPlayerStorageValue(cid, task_finish, -1) pokemonNameOpcao1 = '' pokemonNameOpcao2 = '' opcaoSelecionada = nil talkState[cid] = 0 end end end return TRUE end function GetOpcaoSelecionada(cid, msg, opcao) if (string.lower(msg) == string.lower(opcao.PokemonName)) then setPlayerStorageValue(cid, task_start, 1) selfSay("Voce comecou a task, voce precisa matar ["..opcao.Count.." "..opcao.PokemonName.."]. Boa Sorte!") npcHandler:releaseFocus(cid) talkState[cid] = 0 end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) +REP, para quem conseguir me ajudar! Grato desde já!
Postado Fevereiro 8, 2021 4 anos Autor 1 minuto atrás, Pisces disse: Coloca pra zerar as storages da task quando o servidor iniciar Poderia me mostrar ?
Postado Fevereiro 11, 2021 4 anos @knepperzik Boa tarde, vá até a pasta data/creaturescripts/scripts abra o arquivo login.lua e embaixo aonde está function onLogin(cid) coloque este trecho de código: if getPlayerStorageValue(cid, task_start) > 0 then ClearAllStoragePlayer(cid) setPlayerStorageValue(cid, task_start, -1) end if getPlayerStorageValue(cid, task_finish) > 0 then setPlayerStorageValue(cid, task_finish , -1) end if getPlayerStorageValue(cid, task_start_opcao1) > 0 then setPlayerStorageValue(cid, task_start_opcao1, -1) end if getPlayerStorageValue(cid, task_start_opcao2) > 0 then setPlayerStorageValue(cid, task_start_opcao2, -1) end Editado Fevereiro 11, 2021 4 anos por MatteusDeli (veja o histórico de edições)
Postado Fevereiro 12, 2021 4 anos Autor Em 11/02/2021 em 16:22, MatteusDeli disse: @knepperzik Boa tarde, vá até a pasta data/creaturescripts/scripts abra o arquivo login.lua e embaixo aonde está function onLogin(cid) coloque este trecho de código: if getPlayerStorageValue(cid, task_start) > 0 then ClearAllStoragePlayer(cid) setPlayerStorageValue(cid, task_start, -1) end if getPlayerStorageValue(cid, task_finish) > 0 then setPlayerStorageValue(cid, task_finish , -1) end if getPlayerStorageValue(cid, task_start_opcao1) > 0 then setPlayerStorageValue(cid, task_start_opcao1, -1) end if getPlayerStorageValue(cid, task_start_opcao2) > 0 then setPlayerStorageValue(cid, task_start_opcao2, -1) end Funcionou de certa forma, ao dar o Server Save ele reseta as tasks, então ele teria que terminar a task antes do Server Save?
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.