Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

08/01/2017

SISTEMA ATUALIZADO PARA 4.0:

 

 

 

 

Citar

Updates

12/01/2012:

para correção de bugs no npc.

19/03/2012 :

adicionada Lib

Configuração da task mais fácil

todos possíveis bugs removidos

09/04/12

Agora eles terão que iniciar a task pelo npc, tendo que completar uma por vez.

Eles poderão sair de uma task a qualquer hora pelo npc

Poderão também escolher que task desejam fazer

09/07/12

Sistema foi passado para Mods

Room Bosses Adicionado

Time Room Bosses -- evita que o jogador fique segurando o respaw do boss

Monster por raças: exemplo na task do rotworm, vai contar tanto se matar carion worm como conta tbm se matar rowotm

Configuração de items,exp e money mais prático

Rank Task Finalizada, só usar o comando !task rank

Créditos Finais: Vodkart & Demonbholder

Versão testada: 8.54 ~ 8.60

Sobre: é um npc de task simples,onde você tem que matar "x" quantidade de monstro para receber uma recompensa ,seja ela items ou experiência.

Task Adicionais:

- Comando que checa quantidade de monstro que você já matou.

- Ao completar todas as task você recebe items especiais.

- Os 10 primeiros jogadores a completar a task ganham um troféu único, items ou money ou exp(tudo configurável)

-- Avisa quando a task de tal monstro foi completada

Screen:

Spoiler

Npc

http://img138.imageshack.us/img138/7546/npcl.png

------

talkactions !task

S8UIt.png

-----

avisa quando acabou a task do mostro que está matando

7xvnd.png

(no meu caso o minotaur task)

-----

mostra o rank de task finalizados por jogador

hw7FO.png

-----

Os 10 primeiros ganham troféu e Premium Days(configurável)

Ch7fu.png

(no meu caso fui o primeiro do ot kk)

Mods:

Spoiler

Simple Task.xml

 



<?xml version="1.0" encoding="UTF-8"?>  

<mod name="Simple Task" version="3.0" author="Vodkart" contact="tibiaking.com" enabled="yes">  

<config name="task_func"><![CDATA[


tasktabble = {

["troll"] = {monster_race={"troll","frost troll","furious troll","island troll","swamp troll","troll champion","troll legionnaire"}, storage_start = 200201, storage = 91001,count = 150,exp = 200,money = 250},

["globin"] = {monster_race={"goblin","goblin assassin","goblin leader"}, storage_start = 200202, storage = 91002,count = 150,exp = 300,money = 300},

["rotworm"] = {monster_race={"rotworm","carrion worm"}, storage_start = 200203, storage = 91003,count = 300,exp = 1000,money = 800},

["cyclops"] = {monster_race={"cyclops","cyclops smith","cyclops drone"}, storage_start = 200204, storage = 91004,count = 500,exp = 3000,money = 800},

["green djinn"] = {monster_race={"green djinn","efreet"}, storage_start = 200205, storage = 91005,count = 500,exp = 10000,money = 5000},

["blue djinn"] = {monster_race={"blue djinn","marid"}, storage_start = 200206, storage = 91006,count = 500,exp = 10000,money = 5000},

["pirate one"] = {monster_race={"pirate buccaneer","pirate corsair","pirate cutthroat","pirate ghost","pirate marauder","pirate skeleton"}, storage_start = 200207, storage = 91007,count = 300,exp = 10000,money = 5000},

["pirate two"] = {monster_race={"pirate buccaneer","pirate corsair","pirate cutthroat","pirate ghost","pirate marauder","pirate skeleton"}, storage_start = 200208, storage = 91008,count = 300,exp = 10000,money = 5000},

["minotaur"] = {monster_race={"minotaur","minotaur archer","minotaur mage","minotaur guard"}, storage_start = 200209, storage = 91009,count = 20},

["necromancer"] = {monster_race={"necromancer","priestess"}, storage_start = 200210, storage = 91010,count= 400},

["carniphila"] = {monster_race={"carniphila"}, storage_start = 200211, storage = 91011,count= 150, exp = 2500},

["stone golem"] = {monster_race={"stone golem"}, storage_start = 200212, storage = 91012,count= 220, exp = 2000},

["ice golem"] = {monster_race={"ice golem"}, storage_start = 200213, storage = 91013,count= 300, exp = 12000},

["dragon"] = {monster_race={"dragon","dragon lord","frost dragon"}, storage_start = 200214, storage = 91014,count= 250, exp = 50000},

["mutated rat"] = {monster_race={"mutated rat"}, storage_start = 200215, storage = 91015,count = 210, exp = 25000, money = 10000},

["giant spider"] = {monster_race={"giant spider"}, storage_start = 200215, storage = 91016,count = 500, exp = 50000, money = 15000},

["hydra"] = {monster_race={"hydra"}, storage_start = 200217, storage = 91017,count = 5000, exp = 2000, money = 15000, reward = {{6433,1},{7434,1},{2197,1},{2476,1}}},

["sea serpent"] = {monster_race={"sea serpent"}, storage_start = 200218, storage = 91018,count = 1500, exp = 70000, money = 30000},

["behemoth"] = {monster_race={"behemoth"}, storage_start = 200219, storage = 91019,count = 1800, exp = 50000, money = 30000, reward = {{6391,1},{5741,1}}},

["serpent spawn"] = {monster_race={"serpent spawn"}, storage_start = 200220, storage = 91020,count = 1400, exp = 70000, money = 30000},

["demon"] = {monster_race={"demon"}, storage_start = 200221, storage = 91021,count = 6666, exp = 70000, money = 200000, reward = {{2495,1},{2496,1},{2520,1},{2472,1}}},

["quara"] = {monster_race={"quara predator","quara constrictor","quara hydromancer","quara mantassin","quara pincher"}, storage_start = 200222, storage = 91022,count = 300, exp = 40000, money = 50000},

["quara scout"] = {monster_race={"quara predator scout","quara constrictor scout","quara hydromancer scout","quara mantassin scout","quara pincher scout"}, storage_start = 200223, storage = 91023,count = 300, exp = 50000, money = 60000}

}



configbosses_task = {

{race = "minotaur",Playerpos = {x = 189, y = 57, z = 7}, FromPosToPos = {{x = 186, y = 54, z = 7},{x = 193, y = 60, z = 7}},time = 5},

{race = "necromancer",Playerpos = {x = 196, y = 39, z = 7}, FromPosToPos = {{x = 195, y = 37, z = 7},{x = 198, y = 41, z = 7}}, time = 5},

{race = "dragon",Playerpos = {x = 208, y = 59, z = 7}, FromPosToPos = {{x = 206, y = 56, z = 7},{x = 209, y = 65, z = 7}}, time = 5}

}


function CheckTask(cid)

for k, v in pairs(tasktabble) do

if getPlayerStorageValue(cid,v.storage_start) >= 1 then return true end

end

return false

end

function finisheAllTask(cid)

local config = {

exp = {true,100000},

money = {true,200000},

items ={false,{{2124,2},{2173,1}}},

premium ={true,5}

}

local x = true

for k, v in pairs(tasktabble) do

if tonumber(getPlayerStorageValue(cid,v.storage)) then

x = false

end

end

if x == true then

setPlayerStorageValue(cid, 521456, 0)

local b = getGlobalStorageValue(63005) if b == -1 then b = 1 end

if b < 11 then

setGlobalStorageValue(63005,b+1)

doBroadcastMessage('[Task Mission Complete] '..getCreatureName(cid)..' was the '..b..' to finish the task!.')

doPlayerAddPremiumDays(cid, config.premium[1] == true and config.premium[2] or 0)

doPlayerAddExp(cid, config.exp[1] == true and config.exp[2] or 0)

doPlayerAddMoney(cid, config.money[1] == true and config.money[2] or 0)

if config.items[1] == true then doAddItemsFromList(cid,config.items[2]) end

doItemSetAttribute(doPlayerAddItem(cid, 7369), "name", "trophy "..getCreatureName(cid).." completed all the task.")

end

end

end

function HavePlayerPosition(cid, from, to)

	return isInRange(getPlayerPosition(cid), from, to) and true or false

end

function getRankStorage(cid, value, max, RankName) -- by vodka

local str =""

str = "--[".. (RankName == nil and "RANK STORAGE" or ""..RankName.."") .."]--\n\n"

local query = db.getResult("SELECT `player_id`, `value` FROM `player_storage` WHERE `key` = "..value.." ORDER BY cast(value as INTEGER) DESC;")

if (query:getID() ~= -1) then k = 1 repeat if k > max then break end

str = str .. "\n " .. k .. ". "..getPlayerNameByGUID(query:getDataString("player_id")).." - [" .. query:getDataInt("value") .. "]"

k = k + 1 until not query:next() end return doShowTextDialog(cid, 2529, str)

end

function getItemsInContainerById(container, itemid) -- Function By Kydrai

			local items = {}

			if isContainer(container) and getContainerSize(container) > 0 then

							for slot=0, (getContainerSize(container)-1) do

											local item = getContainerItem(container, slot)

											if isContainer(item.uid) then

															local itemsbag = getItemsInContainerById(item.uid, itemid)

															for i=0, #itemsbag do

																			table.insert(items, itemsbag[i])

															end

											else

															if itemid == item.itemid then

																			table.insert(items, item.uid)

															end

											end

							end

			end

			return items

end

function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo

	local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)

	local piles = 0

	if #item > 0 then

			for i,x in pairs(item) do

					if getThing(x).type < 100 then

							local it = getThing(x)

							doTransformItem(it.uid, itemid, it.type+quant)

							if it.type+quant > 100 then

									doPlayerAddItem(cid, itemid, it.type+quant-100)

							end

					else

						   piles = piles+1

					end

			end

	else

			return doPlayerAddItem(cid, itemid, quant)

	end

	if piles == #item then

			doPlayerAddItem(cid, itemid, quant)

	end

end

function getItemsFromList(items) -- by vodka

local str = ''

if table.maxn(items) > 0 then

for i = 1, table.maxn(items) do

str = str .. items[i][2] .. ' ' .. getItemNameById(items[i][1])

if i ~= table.maxn(items) then str = str .. ', ' end end end

return str

end

function doAddItemsFromList(cid,items) -- by vodka

if table.maxn(items) > 0 then

for i = 1, table.maxn(items) do

local count = items[i][2]

while count > 0 do

if isItemStackable(items[i][1]) then

doPlayerAddItemStacking(cid, items[i][1], 1)

else

doPlayerAddItem(cid, items[i][1],1)

end

count = count - 1

end

end

end

end

		function pairsByKeys(t, f)

		  local a = {}

		  for n in pairs(t) do table.insert(a, n) end

		  table.sort(a, f)

		  local i = 0

		  local iter = function ()

				i = i + 1

				if a[i] == nil then return nil

				else return a[i], t[a[i]]

				end

		  end

		  return iter

		end

]]></config>

<event type="login" name="TaskLogin" event="script"><![CDATA[

function onLogin(cid)

registerCreatureEvent(cid, "KillTask")

return true

end]]></event>

<talkaction words="/task;!task" event="buffer"><![CDATA[

domodlib('task_func')

local param = string.lower(param)

if param == "rank" then

getRankStorage(cid, 521456, 20, "Task Rank Finalizadas") return true

end

local str = ""

str = str .. "Task Completed :\n\n"

for k, v in pairsByKeys(tasktabble) do

local contagem = getPlayerStorageValue(cid, v.storage)

if (contagem == -1) then contagem = 1 end

str = str..k.." = ".. (not tonumber(contagem) and "["..contagem.."]" or "["..((contagem)-1).."/"..v.count.."]") .."\n"

end

str = str .. ""

return doShowTextDialog(cid, 8983, str)

]]></talkaction>	

<event type="kill" name="KillTask" event="script"><![CDATA[

domodlib('task_func')

function onKill(cid, target, lastHit)

if(isMonster(target) == true) then

local n = string.lower(getCreatureName(target))

for race, mob in pairs(tasktabble) do

if getPlayerStorageValue(cid,mob .storage_start) >= 1 then

for i = 1,#mob.monster_race do

if n == mob.monster_race[i] then

local contagem = getPlayerStorageValue(cid, mob.storage)

if (contagem == -1) then contagem = 1 end

if not tonumber(contagem) then return true end

if contagem > mob.count then return true end

if contagem > mob.count then return true end

setPlayerStorageValue(cid, mob.storage, contagem+1)

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,""..(contagem == mob.count and "Congratulations! You finished the task of "..race.."." or "defeated. Total [" .. contagem .. "/" .. mob.count .. "] " .. race .. ".").."")

end

end

end

end

end

return true

end]]></event>

</mod>

NPC
Spoiler
NPC/SCRIPT simple_task.lua
 



domodlib('task_func')

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

function creatureSayCallback(cid, type, msg)

if(not npcHandler:isFocused(cid)) then

return false

end

local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid

local msg = string.lower(msg)

if isInArray({"task","tasks","missao","mission"}, msg) then

npcHandler:say("Me diga o nome do monstro que você deseja fazer a task!", cid)

talkState[talkUser] = 1

elseif talkState[talkUser] == 1 then

if tasktabble[msg] then

if CheckTask(cid) ~= true then

local contagem = getPlayerStorageValue(cid, tasktabble[msg].storage)

if (contagem == -1) then contagem = 1 end

if not tonumber(contagem) then npcHandler:say('Desculpe, mas você já terminou a task do '..msg, cid) return true end

setPlayerStorageValue(cid, tasktabble[msg].storage_start, 1)

npcHandler:say("Parabéns, agora você está participando da missão task do "..msg..", falta matar "..string.sub(((contagem)-1)-tasktabble[msg].count, 2).." "..msg, cid)

talkState[talkUser] = 0

else

npcHandler:say('Desculpe, mas você já faz parte de uma task!', cid)

talkState[talkUser] = 0

end

else

npcHandler:say('digite o nome correto da missão task! para mais informações digite {!task}', cid)

talkState[talkUser] = 1

end

elseif isInArray({"receber","reward","recompensa","report","reportar"}, msg) then

if CheckTask(cid) then

for k, v in pairs(tasktabble) do

racetype = k

if getPlayerStorageValue(cid,v.storage_start) >= 1 then

local contagem = getPlayerStorageValue(cid, v.storage)

if (contagem == -1) then contagem = 1 end

if not tonumber(contagem) then npcHandler:say('você só pode receber os items uma única vez!', cid) return true end

if (((contagem)-1) >= v.count) then

for _, check in pairs(configbosses_task) do

if string.lower(check.race) == string.lower(racetype) then

local on = getPlayersOnline()

for i=1, #on do

if HavePlayerPosition(on[i], check.FromPosToPos[1],check.FromPosToPos[2]) then

selfSay('aguarde alguns instantes, tem pessoas fazendo a task.', cid) return true

end

end

doTeleportThing(cid, check.Playerpos)

local function checkArea(cid)

if not isCreature(cid) then return LUA_ERROR end

if HavePlayerPosition(cid, check.FromPosToPos[1],check.FromPosToPos[2]) then

doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))

end

end

addEvent(checkArea, check.time*60*1000, cid)

end

end

local str = ""

if v.exp ~= nil then doPlayerAddExp(cid, v.exp ) str = str.."".. (str == "" and "" or ",") .." "..v.exp.." de exp" end

if v.money ~= nil then doPlayerAddMoney(cid, v.money) str = str.."".. (str == "" and "" or ",") ..""..v.money.." gps" end

if v.reward ~= nil then doAddItemsFromList(cid,v.reward) str = str.."".. (str == "" and "" or ",") ..""..getItemsFromList(v.reward) end

npcHandler:say("Obrigado pela sua ajuda Recompensas: "..(str == "" and "nenhuma" or ""..str.."").." por ter completado a task do "..k, cid)

setPlayerStorageValue(cid, v.storage, "Finished")

setPlayerStorageValue(cid, v.storage_start, 0)

setPlayerStorageValue(cid, 521456, getPlayerStorageValue(cid, 521456) == -1 and 1 or getPlayerStorageValue(cid, 521456)+1)

finisheAllTask(cid)

else

npcHandler:say('Desculpe,mas você só matou '..((contagem)-1)..' de '..v.count..' '..k, cid)

end

end

end

else

npcHandler:say("você não está em nenhuma missão task", cid)

end

elseif isInArray({"sair","leave","exit"}, msg) then

if CheckTask(cid) then

talkState[talkUser] = 2

for k, v in pairs(tasktabble) do

if getPlayerStorageValue(cid,v.storage_start) >= 1 then

storagesair = v.storage_start

local contagem = getPlayerStorageValue(cid, v.storage)

if (contagem == -1) then contagem = 1 end

npcHandler:say('você está participando de uma missão task do '..k..' e já tem '..((contagem)-1)..' '..k..' mortos, deseja mesmo sair?', cid)

end

end

else

npcHandler:say("você não está em nenhuma missão task", cid)

end

elseif msgcontains(msg, 'yes') and talkState[talkUser] == 2 then

setPlayerStorageValue(cid, storagesair, 0)

npcHandler:say("Você foi retirado da task com sucesso!", cid)

elseif msg == "no" then  

selfSay("Tudo bem então", cid)  

talkState[talkUser] = 0  

npcHandler:releaseFocus(cid)  

end

return TRUE

end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)

npcHandler:addModule(FocusModule:new())

NPC Ludger.xml

 



<?xml version="1.0"?>

<npc name="Ludger" script="data/npc/scripts/simple_task.lua" walkinterval="50000" floorchange="0">

<health now="100" max="100"/>

<look type="129" head="95" body="116" legs="121" feet="115" addons="3"/>

<parameters>

<parameter key="message_greet" value="Ola |PLAYERNAME|. quer fazer uma {task}? ou {sair} de uma? tambem pode {receber} premios se terminou ela!" />

</parameters>

</npc>

Como configurar?
Spoiler
-- configuração task monstros -- para configurar você vai ali no Mods lá tem uma tabela chamada 'tasktabble' que funciona da seguinte maneira: ["nome da task"] -- aqui você coloca o nome da task monster_race={"nome dos monstro"} -- aqui você coloca o nome dos monstro que vão contar na task exemplo:
 



monster_race={"cyclops","cyclops smith","cyclops drone"}

ou seja vai contar nessa task tanto se eu matar um 'cyclops' como matar tbm um 'cyclops drone' storage_start -- n mexa, é para checar se ele está com a task storage -- é o valor da storage para fazer a contagem. obs: não edite count -- é o total de monstro que tem que matar money -- é qnto de dinheiro ele vai receber ao terminar a task, se n quiser colocar pra receber money só remover essa parte exp -- é quanto ele vai ganhar de exp ao terminar a task, se n quiser colocar pra receber exp só remover essa parte reward -- é a lista dos items que ele vai ganhar ao terminar a task, caso não queira que ele receba items só remover essa parte -- configuração bosses -- em mods tem uma tabela chamada 'configbosses_task'

 



configbosses_task = {

{race = "minotaur",Playerpos = {x = 189, y = 57, z = 7}, FromPosToPos = {{x = 186, y = 54, z = 7},{x = 193, y = 60, z = 7}},time = 5},

{race = "necromancer",Playerpos = {x = 196, y = 39, z = 7}, FromPosToPos = {{x = 195, y = 37, z = 7},{x = 198, y = 41, z = 7}}, time = 5},

{race = "dragon",Playerpos = {x = 208, y = 59, z = 7}, FromPosToPos = {{x = 206, y = 56, z = 7},{x = 209, y = 65, z = 7}}, time = 5}

}

race -- é o nome da task que vai ter boss, só olhar dentro dos [""] que vc editou a tabela dos monstros Playerpos -- é pra onde o jogador vai ao entrar no boss FromPosToPos -- nessa parte são duas pos, é o começo da área e o final da área do boss time -- é o limite de tempo em minutos que o jogador vai poder ficar na sala do boss -- configuração recompensas top 10 jogadores terminar todas as TASKS -- ali em mods tem essa tabela:

 



local config = {

exp = {true,100000}, -- vai ganhar exp? se true edite a exp

money = {true,200000}, -- vai ganhar money? se true edite a qntidade de dinheiro

items ={false,{{2124,2},{2173,1}}}, -- vai receber items? se true edite os items dentro da tabela

premium ={false,5} -- vai receber premium days? se true edite os dias q vai receber

}
  • 2 weeks later...
  • Respostas 82
  • Visualizações 22k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • kk seria uma boa mas acho que seria cansativo para configurar, dá para fazer sem problema, só que não tem como fazer por lib e tal para ficar mais fácil de mexer, teria que adicionar no xml cada task

  • function finisheAllTask(cid) local reward = {{XXXX,YY},{XXXX,YY}} local x = true for k, v in pairs(tasktabble) do if tonumber(getPlayerStorageValue(cid,v.storage)) then x = false end end if x

  • Quero passar a task para a versão 4.0   vou retirar o sistema de rank, colocar level para task e task em sequencias.   Postem IDEIAS para eu fazer um upgrade nessa bagaça!!

Posted Images

Postado
  • Autor

Olá, gostaria de pedir a ajuda de vocês para fazer um update para V3.0!

Já vamos adicionar algumas modificações como:

°Look para quem tiver fazendo as task, exemplo:

Taskman - 10 task completa

TaskHunter - 20 task completa

etc...

°Boss

Certas criaturas depois de matar "X" vezes, ela faz com que você seja teleportada para uma room onde você poderá matar esse boss e receber uma recompensa?

Fica a critério de vocês.

por enquanto são essas duas, se alguém tiver algo a acrescentar me avise!

abraços

Postado
  • Autor

Em vez de por na look..

Por quê não coloca no quest log?

Igual do global.. seria interessante ;D

kk seria uma boa mas acho que seria cansativo para configurar, dá para fazer sem problema, só que não tem como fazer por lib e tal para ficar mais fácil de mexer, teria que adicionar no xml cada task :)

mas talvez eu faça sim e ai usa quem quiser xd

obrigado pela sugestão!

abraços

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.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo