Ir para conteúdo

Featured Replies

Postado
  • Autor

é 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.

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

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

  • Respostas 233
  • Visualizações 23k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • vc precisa achar a função que removeItem no 1.0, parece que tiraram ela em 1.0 e substituiram por outra.. o mesmo vale pra onCreatureSay 

  • fico feliz de ter contribuído pro seu projeto de alguma forma.  linha por linha e muito ctrl + c e ctrl + v hahaha pior nem é escrever tudo isso, é dar erro e você não souber aonde que tá e ter

  • oque parece? me manda um print do erro.. é 1.0 né?

Posted Images

Postado

é 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
  • 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 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

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Postado

 

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo