Postado Maio 25, 2015 10 anos Autor é muito simples, vamos lá:function onKill(cid, target, lastHit) -- ao matar um monstro qualquerprint("work") -- vai printar work (isso significa que o script tá configurado corretamente e está funcionando) if isMonster(target) and getPlayerStorageValue(cid, storages.maxcount) > 3 and getCreatureMaster(target) ~= nil and (not(isInParty(cid)) or config.partycount ~= true) then -- /\ diversas checagens, vc tem que garantir que TODAS elas sejam verdadeiras. Caso elas sejam ele irá para o próximo passo Agora se vc não está chegando no próximo passo, vc tem que garantir que as seguintes coisas existem: - isMonster(target) retorna true (essa parte não está errado, se estivesse daria erros no seu console. - getPlayerStorageValue(cid, storages.maxcount) > 3 (aqui ele salva o máximo de monstros que vc tem que matar (vc configura isso lá no npc e eu coloquei que 3 é o minimo que tem que estar salvo pra você poder dar continuidade) - getCreatureMaster(target) ~= nil (esse é bem fácil de verificar, só colocar pra printar o resultado disso: print(getCreatureMaster(target)) depois do print("work") e ver oque sai. Provavelmente o erro está nessa parte. - O resto da checagem é pra ver se está em party e se a configuração de party está ligada/desligadaprint(1) -- aqui é o proximo passo, irá printar 1. Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá! "Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda (obg ao @Beeny por fazer essa linda sign <3)
Postado Maio 25, 2015 10 anos é muito simples, vamos lá: function onKill(cid, target, lastHit) -- ao matar um monstro qualquer print("work") -- vai printar work (isso significa que o script tá configurado corretamente e está funcionando) if isMonster(target) and getPlayerStorageValue(cid, storages.maxcount) > 3 and getCreatureMaster(target) ~= nil and (not(isInParty(cid)) or config.partycount ~= true) then -- /\ diversas checagens, vc tem que garantir que TODAS elas sejam verdadeiras. Caso elas sejam ele irá para o próximo passo Agora se vc não está chegando no próximo passo, vc tem que garantir que as seguintes coisas existem: - isMonster(target) retorna true (essa parte não está errado, se estivesse daria erros no seu console. - getPlayerStorageValue(cid, storages.maxcount) > 3 (aqui ele salva o máximo de monstros que vc tem que matar (vc configura isso lá no npc e eu coloquei que 3 é o minimo que tem que estar salvo pra você poder dar continuidade) - getCreatureMaster(target) ~= nil (esse é bem fácil de verificar, só colocar pra printar o resultado disso: print(getCreatureMaster(target)) depois do print("work") e ver oque sai. Provavelmente o erro está nessa parte. - O resto da checagem é pra ver se está em party e se a configuração de party está ligada/desligada print(1) -- aqui é o proximo passo, irá printar 1. Cara vc me embolou pra cacete Onde vc ta querendo chegar com esse post? kkkk Se é saber onde o cmd ta chegando? Ele só entra até onkill por isso só printa work, ele não entra nos outros dois condicionais if isMonster(target) and getPlayerStorageValue(cid, storages.maxcount) > 3 and getCreatureMaster(target) ~= nil and (not(isInParty(cid)) or config.partycount ~= true) then print(1) elseif isMonster(target) and getCreatureMaster(target) ~= nil and isInParty(cid) and config.partycount == true then print(2)
Postado Maio 29, 2015 10 anos Autor mal a demora, minhas aulas voltaram e tá foda tirar tempo pra ver códigos antigos:: tenta trocar seu creaturescript por esse daqui: local storages = { name = 95672, count = 95673, maxcount = 95674, } local config = { partycount = true, --- true ou false pra ativar/desativar que os kills dos membros da party contem pra voce killdistance = 7 --- distancia que conta os kills } function onKill(cid, target, lastHit) if isMonster(target) and getPlayerStorageValue(cid, storages.maxcount) > 3 and (type(getCreatureMaster(target)) == 'nil' or getCreatureMaster(target) == target) and (not(isInParty(cid)) or config.partycount ~= true) then if getCreatureName(target):lower() == string.lower(getPlayerStorageValue(cid, storages.name)) then setPlayerStorageValue(cid, storages.count, getPlayerStorageValue(cid, storages.count) + 1) if getPlayerStorageValue(cid, storages.count) == getPlayerStorageValue(cid, storages.maxcount) then doPlayerSendTextMessage(cid, 19, "You finished your task.") elseif getPlayerStorageValue(cid, storages.count) < getPlayerStorageValue(cid, storages.maxcount) then doPlayerSendTextMessage(cid, 20, "Killed ".. getCreatureName(target) .."s [".. getPlayerStorageValue(cid, storages.count) .."/".. getPlayerStorageValue(cid, storages.maxcount) .."].") end end elseif isMonster(target) and (type(getCreatureMaster(target)) == 'nil' or getCreatureMaster(target) == target) and isInParty(cid) and config.partycount == true then leader = getPartyLeader(cid) party = getPartyMembers(leader) for i = 1, #party do pid = party[i] if getDistanceBetween(getThingPos(target), getThingPos(pid)) < config.killdistance then if getPlayerStorageValue(pid, storages.maxcount) > 3 then if getCreatureName(target):lower() == string.lower(getPlayerStorageValue(pid, storages.name)) then setPlayerStorageValue(pid, storages.count, getPlayerStorageValue(pid, storages.count) + 1) if getPlayerStorageValue(pid, storages.count) == getPlayerStorageValue(pid, storages.maxcount) then doPlayerSendTextMessage(pid, 19, "You finished your task.") elseif getPlayerStorageValue(pid, storages.count) < getPlayerStorageValue(pid, storages.maxcount) then doPlayerSendTextMessage(pid, 20, "Killed ".. getCreatureName(target) .."s [".. getPlayerStorageValue(pid, storages.count) .."/".. getPlayerStorageValue(pid, storages.maxcount) .."].") end end end end end end return true end EDIT--> Também fiz uma opção de pegar a recompensa em skills e dei uma melhorada no script, basta substituir o script do npc por esse daqui: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} -- OTServ event handling functions start 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 -------------------------------- EXTERN CONFIG -------------------------------- local config = { levelcollect = 30, --- level pra poder fazer tasks do tipo collect time = 8 * 60 * 60, --- tempo que vc vai ficar sem poder falar com ele caso abandone uma task (em segundos) bonus = 1.2, --- bonus de exp/gold caso a task escolhida seja random (1.2 = 20% a mais) multiplicator = 1 --- multiplicador de exp/gold/skills (coloque de acordo com a necessidade do seu server) } local easy = { [1] = "Goblin", [2] = "Troll", [3] = "Rotworm", [4] = "Dwarf", [5] = "Amazon", [6] = "Elf", [7] = "Wolf", [8] = "Orc", [9] = "Minotaur" } local eacollect = { [1] = {id = 5880, count = 20}, -- iron ore [2] = {id = 5902, count = 15}, -- honeycomb [3] = {id = 5878, count = 10}, -- minotaur leather [4] = {id = 5890, count = 20}, -- chicken feather [5] = {id = 5894, count = 15}, -- bat wing [6] = {id = 5896, count = 10}, -- bear pawn [7] = {id = 5897, count = 20}, -- wolf pawn [8] = {id = 5921, count = 15}, -- heaven blossom [9] = {id = 3956, count = 10} -- elephant tusk } local medium = { [1] = "Cyclops", [2] = "Ghoul", [3] = "Dragon", [4] = "Mammoth", [5] = "Vampire", [6] = "Fire Devil", [7] = "Fire Elemental", [8] = "Valkyrie", [9] = "Monk" } local medcollect = { [1] = {id = 5876, count = 35}, -- lizard leather [2] = {id = 5678, count = 30}, -- tortoise egg [3] = {id = 5898, count = 25}, -- beholder eye [4] = {id = 5899, count = 35}, -- turtle shell [5] = {id = 2229, count = 30}, -- skull [6] = {id = 5877, count = 25}, -- dragon leather [7] = {id = 5920, count = 30} -- dragon scale } local hard = { [1] = "Giant Spider", [2] = "Dragon Lord", [3] = "Grim Reaper", [4] = "Demon", [5] = "Crystal Spider", [6] = "Demon Skeleton", [7] = "Juggernaut", [8] = "Destroyer", [9] = "Hand of Cursed Fate" } local hardcollect = { [1] = {id = 5882, count = 50}, -- red dragon scale [2] = {id = 5948, count = 45}, -- red dragon leather [3] = {id = 5930, count = 40}, -- behemoth claw [4] = {id = 5879, count = 50}, -- giant spider silk [5] = {id = 5954, count = 45}, -- demon horn [6] = {id = 6500, count = 40}, -- demoniac essence [7] = {id = 5944, count = 45}, -- soul orb } local storages = { name = 95672, count = 95673, maxcount = 95674, difficult = 95675, length = 95676, delay = 95677, type = 95678, } -------------------------------- END OF EXTERN CONFIG -------------------------------- function creatureSayCallback(cid, type, msg) if (not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid -------------------------------- INTERN CONFIG CAN BE DONE HERE -------------------------- local short = 0 + (math.random(1,3) * 50) -- quantidade de monstros no curto local median = 100 + (math.random(1,3) * 50) -- quantidade de monstros no mediano local long = 200 + (math.random(1,3) * 100) -- quantidade de monstros no longo local gold = 1000 * ((getPlayerStorageValue(cid, storages.length)) + (getPlayerStorageValue(cid, storages.difficult))) * config.multiplicator local experience = ((getExperienceForLevel(getPlayerLevel(cid) + 1) - getExperienceForLevel(getPlayerLevel(cid))) / 100) * ((getPlayerStorageValue(cid, storages.length)) * (getPlayerStorageValue(cid, storages.difficult))) * config.multiplicator -------------------------------- END OF INTERN CONFIG -------------------------- local type = getPlayerStorageValue(cid, storages.type) if (msgcontains(msg, 'task') or msgcontains(msg, 'challenge')) and (getPlayerStorageValue(cid, storages.delay) - os.time()) <= 0 then if getPlayerStorageValue(cid, storages.maxcount) > 3 and getPlayerStorageValue(cid, storages.type) == 1 then talkState[talkUser] = 6 selfSay('Your task is to kill {'..getPlayerStorageValue(cid, storages.maxcount)..' '..getPlayerStorageValue(cid, storages.name)..'s}. Hurry with this or you want to {give up}?!', cid) elseif getPlayerStorageValue(cid, storages.maxcount) > 3 and getPlayerStorageValue(cid, storages.type) == 2 then talkState[talkUser] = 6 selfSay('Your task is to collect {'.. getPlayerStorageValue(cid, storages.maxcount)..' '.. getItemNameById(getPlayerStorageValue(cid, storages.name)) ..'s}. Hurry with this or you want to {give up}?!', cid) else talkState[talkUser] = 1 selfSay('I have two types of tasks, you want to {kill} monsters or to {collect} some items for me? You can also let me choose a {random} one for you, garanting a final bonus in your reward.', cid) end elseif (msgcontains(msg, 'kill') and talkState[talkUser] == 1) then talkState[talkUser] = 2 setPlayerStorageValue(cid, storages.type, 1) selfSay('I have all kinds of tasks, you want a {easy}, {medium} or are you up to a {hard} one?', cid) elseif (msgcontains(msg, 'collect') and talkState[talkUser] == 1 and getPlayerLevel(cid) >= config.levelcollect) then talkState[talkUser] = 2 setPlayerStorageValue(cid, storages.type, 2) selfSay('I have all kinds of tasks, you want a {easy}, {medium} or are you up to a {hard} one?', cid) elseif (msgcontains(msg, 'collect') and talkState[talkUser] == 1 and getPlayerLevel(cid) < config.levelcollect) then talkState[talkUser] = 1 selfSay('You can only do collect tasks once you reach level '..config.levelcollect..'.', cid) ------- difficult --------- elseif (msgcontains(msg, 'random') and talkState[talkUser] == 1) then talkState[talkUser] = 4 selfSay('Are you sure about this?', cid) setPlayerStorageValue(cid, storages.type, math.random(1,2)) setPlayerStorageValue(cid, storages.difficult, math.random(2,4) * config.bonus) setPlayerStorageValue(cid, storages.length, math.random(2,4) * config.bonus) elseif (msgcontains(msg, 'hard') and talkState[talkUser] == 2) then talkState[talkUser] = 3 selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid) setPlayerStorageValue(cid, storages.difficult, 4) elseif (msgcontains(msg, 'medium') and talkState[talkUser] == 2) then talkState[talkUser] = 3 selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid) setPlayerStorageValue(cid, storages.difficult, 3) elseif (msgcontains(msg, 'easy') and talkState[talkUser] == 2) then talkState[talkUser] = 3 selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid) setPlayerStorageValue(cid, storages.difficult, 2) ------- bye --------- elseif (msgcontains(msg, 'no')) and isInArray({1, 6, 7}, talkState[talkUser]) then talkState[talkUser] = 0 selfSay('Clearly you are not ready. We can talk later...', cid) ------- length --------- elseif (msgcontains(msg, 'short') and talkState[talkUser] == 3) then talkState[talkUser] = 4 selfSay('Are you sure about this?', cid) setPlayerStorageValue(cid, storages.length, 2) elseif (msgcontains(msg, 'median') and talkState[talkUser] == 3) then talkState[talkUser] = 4 selfSay('Are you sure about this?', cid) setPlayerStorageValue(cid, storages.length, 3) elseif (msgcontains(msg, 'long') and talkState[talkUser] == 3) then talkState[talkUser] = 4 selfSay('Are you sure about this?', cid) setPlayerStorageValue(cid, storages.length, 4) ----------- give up option ----------- elseif (msgcontains(msg, 'give up') and talkState[talkUser] == 6) then selfSay('Are you saying that you want to give up this task? I will not give you any other task in the next '.. (config.time/3600) ..' hour(s).', cid) talkState[talkUser] = 7 elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 7) then selfSay('Since you will not help me, get out of here.', cid) setPlayerStorageValue(cid, storages.maxcount, 0) setPlayerStorageValue(cid, storages.delay, os.time() + config.time) talkState[talkUser] = 0 ----------------------- ------- checking --------- elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 4) then local length = getPlayerStorageValue(cid, storages.length) local difficult = getPlayerStorageValue(cid, storages.difficult) if type == 1 then if length == 2 then setPlayerStorageValue(cid, storages.maxcount, short) elseif length == 3 then setPlayerStorageValue(cid, storages.maxcount, median) else setPlayerStorageValue(cid, storages.maxcount, long) end if difficult == 2 then setPlayerStorageValue(cid, storages.name, easy[math.random(1, #easy)]) elseif difficult == 3 then setPlayerStorageValue(cid, storages.name, medium[math.random(1, #medium)]) else setPlayerStorageValue(cid, storages.name, hard[math.random(1, #hard)]) end setPlayerStorageValue(cid, storages.count, 0) talkState[talkUser] = 0 selfSay('OK then.. your task is to kill '..getPlayerStorageValue(cid, storages.maxcount)..' '..getPlayerStorageValue(cid, storages.name)..'s. Do not spare any monster!', cid) elseif type == 2 then if length == 2 then setPlayerStorageValue(cid, storages.maxcount, eacollect[math.random(1, #eacollect)].count) elseif length == 3 then setPlayerStorageValue(cid, storages.maxcount, medcollect[math.random(1, #medcollect)].count) else setPlayerStorageValue(cid, storages.maxcount, hardcollect[math.random(1, #hardcollect)].count) end if difficult == 2 then setPlayerStorageValue(cid, storages.name, eacollect[math.random(1, #eacollect)].id) elseif difficult == 3 then setPlayerStorageValue(cid, storages.name, medcollect[math.random(1, #medcollect)].id) else setPlayerStorageValue(cid, storages.name, hardcollect[math.random(1, #hardcollect)].id) end setPlayerStorageValue(cid, storages.count, 0) talkState[talkUser] = 0 selfSay('OK then.. your task is to collect {'.. getPlayerStorageValue(cid, storages.maxcount)..' '.. getItemNameById(getPlayerStorageValue(cid, storages.name)) ..'s}. Bring me the proof that you made it!', cid) end elseif (msgcontains(msg, 'no') and talkState[talkUser] == 4) then talkState[talkUser] = 0 selfSay('Ok, come back when you have the guts.', cid) ------- reward --------- elseif msgcontains(msg, 'reward') then if type == 1 then if getPlayerStorageValue(cid, storages.count) >= getPlayerStorageValue(cid, storages.maxcount) and getPlayerStorageValue(cid, storages.maxcount) > 3 then selfSay('You finished the quest, now you want to receive your reward in {gold}, {trainning} or in {experience}?', cid) talkState[talkUser] = 5 else selfSay('There is no reward for those who did not complete a challenge.', cid) talkState[talkUser] = 0 end elseif type == 2 then if getPlayerItemCount(cid, getPlayerStorageValue(cid, storages.name)) >= getPlayerStorageValue(cid, storages.maxcount) and getPlayerStorageValue(cid, storages.maxcount) > 3 then selfSay('You finished the quest, now you want to receive your reward in {gold}, {trainning} or in {experience}?', cid) talkState[talkUser] = 5 else selfSay('There is no reward for those who did not complete a challenge.', cid) talkState[talkUser] = 0 end else selfSay('There is no reward for those who did not complete a challenge.', cid) talkState[talkUser] = 0 end ---------- checking rewards --------------- elseif (msgcontains(msg, 'gold') and talkState[talkUser] == 5 ) then if (type == 1) or (doPlayerRemoveItem(cid, getPlayerStorageValue(cid, storages.name), getPlayerStorageValue(cid, storages.maxcount)) and type == 2) then for k, v in pairs(storages) do setPlayerStorageValue(cid, v, 0) end doPlayerAddMoney(cid, gold) talkState[talkUser] = 0 selfSay('Thanks for your help, here is your prize..', cid) else selfSay('Something went wrong..', cid) end elseif (msgcontains(msg, 'experience') and talkState[talkUser] == 5) then if (type == 1) or (doPlayerRemoveItem(cid, getPlayerStorageValue(cid, storages.name), getPlayerStorageValue(cid, storages.maxcount)) and type == 2) then for k, v in pairs(storages) do setPlayerStorageValue(cid, v, 0) end doPlayerAddExperience(cid, experience) talkState[talkUser] = 0 selfSay('Thanks for your help, here is your prize..', cid) else selfSay('Something went wrong..', cid) end elseif (msgcontains(msg, 'trainning') and talkState[talkUser] == 5) then talkState[talkUser] = 8 selfSay('Which skill you want to train with me? choose between {axe}, {distance}, {club}, {sword}, {shield} and {magic}', cid) ----------------------- SKILL REWARD ----------------------- elseif (SKILL_IDS[msg] and talkState[talkUser] == 8) then if (type == 1) or (doPlayerRemoveItem(cid, getPlayerStorageValue(cid, storages.name), getPlayerStorageValue(cid, storages.maxcount)) and type == 2) then for k, v in pairs(storages) do setPlayerStorageValue(cid, v, 0) end -- a divisao por 3000 foi porque cada ponto de skill try equivale a 30 tries de skill e nos naturalmente dividimos por 100. 1/30 * 1/100 = 1/3000 local qnt = math.ceil(getPlayerRequiredSkillTries(cid, SKILL_IDS[msg], getPlayerSkillLevel(cid, SKILL_IDS[msg]) + 1)/3000) * ((getPlayerStorageValue(cid, storages.length)) * (getPlayerStorageValue(cid, storages.difficult)) * config.multiplicator) doPlayerAddSkillTry(cid, SKILL_IDS[msg], qnt) doSendMagicEffect(getCreaturePosition(cid), 39) talkState[talkUser] = 0 selfSay('Thanks for your help, here is your prize..', cid) else selfSay('Something went wrong..', cid) end ----------------------- msg when blocked -------------- elseif (msgcontains(msg, 'task') or msgcontains(msg, 'challenge')) and (getPlayerStorageValue(cid, storages.delay) - os.time()) > 0 then talkState[talkUser] = 0 selfSay('I can not trust you since you failed in the last job. You will have to wait until I feel that I can trust you again..', cid) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Você tem que garantir que em data/lib/constant existe essa tabela (se nao tiver, é só colocar): SKILL_IDS = { ["fist"] = SKILL_FIST, ["club"] = SKILL_CLUB, ["sword"] = SKILL_SWORD, ["axe"] = SKILL_AXE, ["distance"] = SKILL_DISTANCE, ["dist"] = SKILL_DISTANCE, ["shielding"] = SKILL_SHIELD, ["shield"] = SKILL_SHIELD, ["fishing"] = SKILL_FISHING, ["fish"] = SKILL_FISHING, ["level"] = SKILL__LEVEL, ["magic"] = SKILL__MAGLEVEL } e que essas variáveis possuam esses valores: SKILL_FIST = 0 SKILL_CLUB = 1 SKILL_SWORD = 2 SKILL_AXE = 3 SKILL_DISTANCE = 4 SKILL_SHIELD = 5 SKILL_FISHING = 6 SKILL__MAGLEVEL = 7 SKILL__LEVEL = 8 Editado Maio 30, 2015 10 anos por xWhiteWolf (veja o histórico de edições) Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá! "Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda (obg ao @Beeny por fazer essa linda sign <3)
Postado Maio 29, 2015 10 anos mal a demora, minhas aulas voltaram e tá foda tirar tempo pra ver códigos antigos:: tenta trocar seu creaturescript por esse daqui: local storages = { name = 95672, count = 95673, maxcount = 95674, } local config = { partycount = true, --- true ou false pra ativar/desativar que os kills dos membros da party contem pra voce killdistance = 7 --- distancia que conta os kills } function onKill(cid, target, lastHit) if isMonster(target) and getPlayerStorageValue(cid, storages.maxcount) > 3 and (type(getCreatureMaster(target)) == 'nil' or getCreatureMaster(target) == target) and (not(isInParty(cid)) or config.partycount ~= true) then if getCreatureName(target):lower() == string.lower(getPlayerStorageValue(cid, storages.name)) then setPlayerStorageValue(cid, storages.count, getPlayerStorageValue(cid, storages.count) + 1) if getPlayerStorageValue(cid, storages.count) == getPlayerStorageValue(cid, storages.maxcount) then doPlayerSendTextMessage(cid, 19, "You finished your task.") elseif getPlayerStorageValue(cid, storages.count) < getPlayerStorageValue(cid, storages.maxcount) then doPlayerSendTextMessage(cid, 20, "Killed ".. getCreatureName(target) .."s [".. getPlayerStorageValue(cid, storages.count) .."/".. getPlayerStorageValue(cid, storages.maxcount) .."].") end end elseif isMonster(target) and (type(getCreatureMaster(target)) == 'nil' or getCreatureMaster(target) == target) and isInParty(cid) and config.partycount == true then leader = getPartyLeader(cid) party = getPartyMembers(leader) for i = 1, #party do pid = party[i] if getDistanceBetween(getThingPos(target), getThingPos(pid)) < config.killdistance then if getPlayerStorageValue(pid, storages.maxcount) > 3 then if getCreatureName(target):lower() == string.lower(getPlayerStorageValue(pid, storages.name)) then setPlayerStorageValue(pid, storages.count, getPlayerStorageValue(pid, storages.count) + 1) if getPlayerStorageValue(pid, storages.count) == getPlayerStorageValue(pid, storages.maxcount) then doPlayerSendTextMessage(pid, 19, "You finished your task.") elseif getPlayerStorageValue(pid, storages.count) < getPlayerStorageValue(pid, storages.maxcount) then doPlayerSendTextMessage(pid, 20, "Killed ".. getCreatureName(target) .."s [".. getPlayerStorageValue(pid, storages.count) .."/".. getPlayerStorageValue(pid, storages.maxcount) .."].") end end end end end end return true end EDIT--> Também fiz uma opção de pegar a recompensa em skills e dei uma melhorada no script, basta substituir o script do npc por esse daqui: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} -- OTServ event handling functions start 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 -- OTServ event handling functions end function creatureSayCallback(cid, type, msg) -- Place all your code in here. Remember that hi, bye and all that stuff is already handled by the npcsystem, so you do not have to take care of that yourself. if (not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid -------------------------------- ALL CONFIG CAN BE DONE HERE -------------------------- local short = 0 + (math.random(1,3) * 50) -- quantidade de monstros no curto local median = 100 + (math.random(1,3) * 50) -- quantidade de monstros no mediano local long = 200 + (math.random(1,3) * 100) -- quantidade de monstros no longo local config = { levelcollect = 30, --- level pra poder fazer tasks do tipo collect time = 8 * 60 * 60, --- tempo que vc vai ficar sem poder falar com ele caso abandone uma task (em segundos) bonus = 1.2, --- bonus de exp/gold caso a task escolhida seja random (1.2 = 20% a mais) multiplicator = 1 --- multiplicador de exp/gold/skills (coloque de acordo com a necessidade do seu server) } local easy = { [1] = "Goblin", [2] = "Troll", [3] = "Rotworm", [4] = "Dwarf", [5] = "Amazon", [6] = "Elf", [7] = "Wolf", [8] = "Orc", [9] = "Minotaur" } local eacollect = { [1] = {id = 5880, count = 20}, -- iron ore [2] = {id = 5902, count = 15}, -- honeycomb [3] = {id = 5878, count = 10}, -- minotaur leather [4] = {id = 5890, count = 20}, -- chicken feather [5] = {id = 5894, count = 15}, -- bat wing [6] = {id = 5896, count = 10}, -- bear pawn [7] = {id = 5897, count = 20}, -- wolf pawn [8] = {id = 5921, count = 15}, -- heaven blossom [9] = {id = 3956, count = 10} -- elephant tusk } local medium = { [1] = "Cyclops", [2] = "Ghoul", [3] = "Dragon", [4] = "Mammoth", [5] = "Vampire", [6] = "Fire Devil", [7] = "Fire Elemental", [8] = "Valkyrie", [9] = "Monk" } local medcollect = { [1] = {id = 5876, count = 35}, -- lizard leather [2] = {id = 5678, count = 30}, -- tortoise egg [3] = {id = 5898, count = 25}, -- beholder eye [4] = {id = 5899, count = 35}, -- turtle shell [5] = {id = 2229, count = 30}, -- skull [6] = {id = 5877, count = 25}, -- dragon leather [7] = {id = 5920, count = 30} -- dragon scale } local hard = { [1] = "Giant Spider", [2] = "Dragon Lord", [3] = "Grim Reaper", [4] = "Demon", [5] = "Crystal Spider", [6] = "Demon Skeleton", [7] = "Juggernaut", [8] = "Destroyer", [9] = "Hand of Cursed Fate" } local hardcollect = { [1] = {id = 5882, count = 50}, -- red dragon scale [2] = {id = 5948, count = 45}, -- red dragon leather [3] = {id = 5930, count = 40}, -- behemoth claw [4] = {id = 5879, count = 50}, -- giant spider silk [5] = {id = 5954, count = 45}, -- demon horn [6] = {id = 6500, count = 40}, -- demoniac essence [7] = {id = 5944, count = 45}, -- soul orb } local storages = { name = 95672, count = 95673, maxcount = 95674, difficult = 95675, length = 95676, delay = 95677, type = 95678, } local gold = 1000 * ((getPlayerStorageValue(cid, storages.length)) + (getPlayerStorageValue(cid, storages.difficult))) * config.multiplicator local experience = ((getExperienceForLevel(getPlayerLevel(cid) + 1) - getExperienceForLevel(getPlayerLevel(cid))) / 100) * ((getPlayerStorageValue(cid, storages.length)) * (getPlayerStorageValue(cid, storages.difficult))) * config.multiplicator -------------------------------- END OF ALL CONFIG -------------------------- local type = getPlayerStorageValue(cid, storages.type) if (msgcontains(msg, 'task') or msgcontains(msg, 'challenge')) and (getPlayerStorageValue(cid, storages.delay) - os.time()) <= 0 then if getPlayerStorageValue(cid, storages.maxcount) > 3 and getPlayerStorageValue(cid, storages.type) == 1 then talkState[talkUser] = 6 selfSay('Your task is to kill {'..getPlayerStorageValue(cid, storages.maxcount)..' '..getPlayerStorageValue(cid, storages.name)..'s}. Hurry with this or you want to {give up}?!', cid) elseif getPlayerStorageValue(cid, storages.maxcount) > 3 and getPlayerStorageValue(cid, storages.type) == 2 then talkState[talkUser] = 6 selfSay('Your task is to collect {'.. getPlayerStorageValue(cid, storages.maxcount)..' '.. getItemNameById(getPlayerStorageValue(cid, storages.name)) ..'s}. Hurry with this or you want to {give up}?!', cid) else talkState[talkUser] = 1 selfSay('I have two types of tasks, you want to {kill} monsters or to {collect} some items for me? You can also let me choose a {random} one for you, garanting a final bonus in your reward.', cid) end elseif (msgcontains(msg, 'kill') and talkState[talkUser] == 1) then talkState[talkUser] = 2 setPlayerStorageValue(cid, storages.type, 1) selfSay('I have all kinds of tasks, you want a {easy}, {medium} or are you up to a {hard} one?', cid) elseif (msgcontains(msg, 'collect') and talkState[talkUser] == 1 and getPlayerLevel(cid) >= config.levelcollect) then talkState[talkUser] = 2 setPlayerStorageValue(cid, storages.type, 2) selfSay('I have all kinds of tasks, you want a {easy}, {medium} or are you up to a {hard} one?', cid) elseif (msgcontains(msg, 'collect') and talkState[talkUser] == 1 and getPlayerLevel(cid) < config.levelcollect) then talkState[talkUser] = 1 selfSay('You can only do collect tasks once you reach level '..config.levelcollect..'.', cid) ------- difficult --------- elseif (msgcontains(msg, 'random') and talkState[talkUser] == 1) then talkState[talkUser] = 4 selfSay('Are you sure about this?', cid) setPlayerStorageValue(cid, storages.type, math.random(1,2)) setPlayerStorageValue(cid, storages.difficult, math.random(2,4) * config.bonus) setPlayerStorageValue(cid, storages.length, math.random(2,4) * config.bonus) elseif (msgcontains(msg, 'hard') and talkState[talkUser] == 2) then talkState[talkUser] = 3 selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid) setPlayerStorageValue(cid, storages.difficult, 4) elseif (msgcontains(msg, 'medium') and talkState[talkUser] == 2) then talkState[talkUser] = 3 selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid) setPlayerStorageValue(cid, storages.difficult, 3) elseif (msgcontains(msg, 'easy') and talkState[talkUser] == 2) then talkState[talkUser] = 3 selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid) setPlayerStorageValue(cid, storages.difficult, 2) ------- bye --------- elseif (msgcontains(msg, 'no')) and isInArray({1, 6, 7}, talkState[talkUser]) then talkState[talkUser] = 0 selfSay('Clearly you are not ready. We can talk later...', cid) ------- length --------- elseif (msgcontains(msg, 'short') and talkState[talkUser] == 3) then talkState[talkUser] = 4 selfSay('Are you sure about this?', cid) setPlayerStorageValue(cid, storages.length, 2) elseif (msgcontains(msg, 'median') and talkState[talkUser] == 3) then talkState[talkUser] = 4 selfSay('Are you sure about this?', cid) setPlayerStorageValue(cid, storages.length, 3) elseif (msgcontains(msg, 'long') and talkState[talkUser] == 3) then talkState[talkUser] = 4 selfSay('Are you sure about this?', cid) setPlayerStorageValue(cid, storages.length, 4) ----------- give up option ----------- elseif (msgcontains(msg, 'give up') and talkState[talkUser] == 6) then selfSay('Are you saying that you want to give up this task? I will not give you any other task in the next '.. (config.time/3600) ..' hour(s).', cid) talkState[talkUser] = 7 elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 7) then selfSay('Since you will not help me, get out of here.', cid) setPlayerStorageValue(cid, storages.maxcount, 0) setPlayerStorageValue(cid, storages.delay, os.time() + config.time) talkState[talkUser] = 0 ----------------------- ------- checking --------- elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 4) then local length = getPlayerStorageValue(cid, storages.length) local difficult = getPlayerStorageValue(cid, storages.difficult) if type == 1 then if length == 2 then setPlayerStorageValue(cid, storages.maxcount, short) elseif length == 3 then setPlayerStorageValue(cid, storages.maxcount, median) else setPlayerStorageValue(cid, storages.maxcount, long) end if difficult == 2 then setPlayerStorageValue(cid, storages.name, easy[math.random(1, #easy)]) elseif difficult == 3 then setPlayerStorageValue(cid, storages.name, medium[math.random(1, #medium)]) else setPlayerStorageValue(cid, storages.name, hard[math.random(1, #hard)]) end setPlayerStorageValue(cid, storages.count, 0) talkState[talkUser] = 0 selfSay('OK then.. your task is to kill '..getPlayerStorageValue(cid, storages.maxcount)..' '..getPlayerStorageValue(cid, storages.name)..'s. Do not spare any monster!', cid) elseif type == 2 then if length == 2 then setPlayerStorageValue(cid, storages.maxcount, eacollect[math.random(1, #eacollect)].count) elseif length == 3 then setPlayerStorageValue(cid, storages.maxcount, medcollect[math.random(1, #medcollect)].count) else setPlayerStorageValue(cid, storages.maxcount, hardcollect[math.random(1, #hardcollect)].count) end if difficult == 2 then setPlayerStorageValue(cid, storages.name, eacollect[math.random(1, #eacollect)].id) elseif difficult == 3 then setPlayerStorageValue(cid, storages.name, medcollect[math.random(1, #medcollect)].id) else setPlayerStorageValue(cid, storages.name, hardcollect[math.random(1, #hardcollect)].id) end setPlayerStorageValue(cid, storages.count, 0) talkState[talkUser] = 0 selfSay('OK then.. your task is to collect {'.. getPlayerStorageValue(cid, storages.maxcount)..' '.. getItemNameById(getPlayerStorageValue(cid, storages.name)) ..'s}. Bring me the proof that you made it!', cid) end elseif (msgcontains(msg, 'no') and talkState[talkUser] == 4) then talkState[talkUser] = 0 selfSay('Ok, come back when you have the guts.', cid) ------- reward --------- elseif msgcontains(msg, 'reward') then if getPlayerStorageValue(cid, storages.count) >= getPlayerStorageValue(cid, storages.maxcount) and getPlayerStorageValue(cid, storages.maxcount) > 3 then selfSay('You finished the quest, now you want to receive your reward in {gold}, {trainning} or in {experience}?', cid) talkState[talkUser] = 4 else selfSay('There is no reward for those who did not complete a challenge.', cid) talkState[talkUser] = 0 end elseif (msgcontains(msg, 'gold') and talkState[talkUser] == 4) then for k, v in pairs(storages) do setPlayerStorageValue(cid, v, 0) end doPlayerAddMoney(cid, gold) doSendMagicEffect(getCreaturePosition(cid), 13) talkState[talkUser] = 0 selfSay('Thanks for your help, here is your prize..', cid) elseif (msgcontains(msg, 'experience') and talkState[talkUser] == 4) then for k, v in pairs(storages) do setPlayerStorageValue(cid, v, 0) end doPlayerAddExperience(cid, experience) doSendMagicEffect(getCreaturePosition(cid), 14) talkState[talkUser] = 0 selfSay('Thanks for your help, here is your prize..', cid) --- SKILL REWARD --- elseif (msgcontains(msg, 'trainning') and talkState[talkUser] == 4) then talkState[talkUser] = 8 selfSay('Which skill you want to train with me? choose between {axe}, {distance}, {club}, {sword}, {shield} and {magic}', cid) elseif (SKILL_IDS[msg] and talkState[talkUser] == 8) then -- a divisao por 3000 foi porque cada ponto de skill try equivale a 30 tries de skill e nos naturalmente dividimos por 100. 1/30 * 1/100 = 1/3000 local qnt = math.ceil(getPlayerRequiredSkillTries(cid, SKILL_IDS[msg], getPlayerSkillLevel(cid, SKILL_IDS[msg]) + 1)/3000) * ((getPlayerStorageValue(cid, storages.length)) * (getPlayerStorageValue(cid, storages.difficult)) * config.multiplicator) for k, v in pairs(storages) do setPlayerStorageValue(cid, v, 0) end doPlayerAddSkillTry(cid, SKILL_IDS[msg], qnt) doSendMagicEffect(getCreaturePosition(cid), 39) talkState[talkUser] = 0 selfSay('Thanks for your help, here is your prize..', cid) elseif (msgcontains(msg, 'challenge') or msgcontains(msg, 'task')) and (getPlayerStorageValue(cid, storages.delay) - os.time()) > 0 then talkState[talkUser] = 0 selfSay('I can not trust you since you failed in the last job. You will have to wait until I feel that I can trust you again..', cid) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Você tem que garantir que em data/lib/constant existe essa tabela (se nao tiver, é só colocar): SKILL_IDS = { ["fist"] = SKILL_FIST, ["club"] = SKILL_CLUB, ["sword"] = SKILL_SWORD, ["axe"] = SKILL_AXE, ["distance"] = SKILL_DISTANCE, ["dist"] = SKILL_DISTANCE, ["shielding"] = SKILL_SHIELD, ["shield"] = SKILL_SHIELD, ["fishing"] = SKILL_FISHING, ["fish"] = SKILL_FISHING, ["level"] = SKILL__LEVEL, ["magic"] = SKILL__MAGLEVEL } e que essas variáveis possuam esses valores: SKILL_FIST = 0 SKILL_CLUB = 1 SKILL_SWORD = 2 SKILL_AXE = 3 SKILL_DISTANCE = 4 SKILL_SHIELD = 5 SKILL_FISHING = 6 SKILL__MAGLEVEL = 7 SKILL__LEVEL = 8 Que foda vei, vlw, agora ta contando os kills, ta dando até pra entregar task de kill quando finaliza, mas só tem dois problemas Parece que bugou o collect, eu tenho o item tento entregar a task, mas não vai, diz que eu não tenho E task de training não ta indo, mas pode ser pq o meu ta diferente Essa aqui ta igualzinho SKILL_IDS = { ["fist"] = SKILL_FIST, ["club"] = SKILL_CLUB, ["sword"] = SKILL_SWORD, ["axe"] = SKILL_AXE, ["distance"] = SKILL_DISTANCE, ["dist"] = SKILL_DISTANCE, ["shielding"] = SKILL_SHIELD, ["shield"] = SKILL_SHIELD, ["fishing"] = SKILL_FISHING, ["fish"] = SKILL_FISHING, ["level"] = SKILL__LEVEL, ["magic"] = SKILL__MAGLEVEL } mas a segunda o meu ta assim SKILL_FIRST = 0 SKILL_FIST = SKILL_FIRST SKILL_CLUB = 1 SKILL_SWORD = 2 SKILL_AXE = 3 SKILL_DISTANCE = 4 SKILL_SHIELD = 5 SKILL_FISHING = 6 SKILL__MAGLEVEL = 7 SKILL__LEVEL = 8 SKILL_LAST = SKILL_FISHING SKILL__LAST = SKILL__LEVEL Será que é pq ta um pouco diferente? Da merda se eu mudar?
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.