Postado Março 28, 2016 10 anos Fala galera do TK! Então, eu tinha postado esse script mas, por algum motivo sumiu do tk. eu deveria estar bêbado quando postou ele. Mas, vamos para o que interessa. O sistema é o seguinte, ele resume em um só script quests básicas como: item dentro do baú, quests por uid, quests de vocação etc. Vejam algumas imagens que fiz para exemplificar o sistema. Um pequeno tutorial de configuração da quest system: Citar --[[ autor = Marcryzius data = segunda-feira, 28 de Dezembro de 2015 >> Alguns parâmetros de uso. >> item.uid = itemid << id do item que será ganho - caso o item esteja 'inside' no bau, não se faz nescessario usar o id do item na uid - ao habilitar a uid os items que estiverem dentro do bau, não serão usados como items obtiveis da quest, ou seja, não ganharão os items que tem dentro do bau. >> actionid = validação << o bau só será usado na forma de quest se tiver alguma aid. pode usar marcação de vocação como na instrução abaixo ou setar aid maior ou igual à 2000 para validar o bau como uma quest. >> -> actionid = quantidade << desde que ela seja maior que 100 e menor que 200 (150 = 50 items, 200 = 100 items) -> actionid = vocação << o primeiro numero diz que é uma quest de vocação; o segundo habilita que, as vocações promovidas também podem fazer a quest; os dois ultimos numero é da vocação em questão. exemplo 1 = 1201 << sorceres e master sorceres exemplo 2 = 1102 << apenas druids e não elder druids exemplo 3 = 1000 << apenas knights e paladins. exemplo 4 = 1100 << apenas sorcerers e druids. >> inside = varios items << todos os items que forem colocados dentro do bau será usado como referencia do premio da quest; pode-se tambem usar aid para determinar a vocação nescessaria dessa quest. -- ### -- Função getSaveQuestsInfor() está sendo usada por esse script no lugarde storagevalues. Com o uso da nova Função, nao está mais sendo "setado" no player a store da "quest" usando setPlayerStorageValue(). ]] Agora vamos por pra funcionar o sistema. Provavelmente você já tem um sistema desse em seu ot, apenas modifique ele, caso não tenha adicione o que for preciso: Em: data/actions/actions.xml Citar <action fromid="1740" toid="1741" event="script" value="quests/quests.lua"/> <action fromid="1747" toid="1749" event="script" value="quests/quests.lua"/> Agora em: data/lib/050functions.lua Citar function getSaveQuestsInfor(uid,cid) --[[( Marcryzius )]]-- local str = false if(tonumber(uid))then str = db.getResult("SELECT * FROM `server_quests` WHERE `uid` = '"..uid.."' AND `name_player` = ".. db.escapeString(getCreatureName(cid))..";") elseif(type(uid) == 'string')then str = db.getResult("SELECT * FROM `server_quests` WHERE `name_player` = " ..db.escapeString(getCreatureName(cid)).. " AND `name` = '"..uid.."';") else return false,print('getSaveQuestInfor: tipo de uid invalido > '..tostring(type(uid))) end return (str:getID() == -1) and true or false end function saveQuestsInfor(uid,name,cid,other) --[[( Marcryzius )]]-- --[[ uid = Item.uid usado no bau(entre outros) para receber o item da Quest name = nome do item dado ao player ou nome da quest cid = identificacao do player other = informacoes adicionais para serem salvas junto a quest ]]-- if not(db.executeQuery("SELECT * FROM `server_quests`;"))then -- caso a table nao exista, será criada db.executeQuery("CREATE TABLE `server_quests` (`uid` INTEGER, `name` VARCHAR(255), `name_player` VARCHAR(255), `pos` VARCHAR(255), `other` TEXT);") end local other,pos2 = other or '','' local pos = type(uid) == 'number' and getThingPos(uid) or getCreaturePosition(cid) pos2 = 'x='..pos.x..', y='..pos.y..', z='..pos.z if not(type(name) == 'string') or not(tonumber(cid))then return false, print('Funcao requer parametros: name,cid') end db.executeQuery("INSERT INTO `server_quests` (`uid`, `name`, `name_player`,`pos`,`other`) VALUES ("..(uid or tonumber(pos.x..''..pos.y..''..pos.z))..",'"..name.."', '"..getCreatureName(cid).."','"..pos2.."','"..other.."');") return true end Agora em: data/actions/script/quests Crie um arquivo chamado: Citar quests.lua Adicione isso dentro dele: Citar function onUse(cid,item,pos) if(item.actionid >= 1000 and item.actionid < 2000)then if(item.actionid-1000 > 200 and item.actionid-1000 < 300 and not(getPlayerVocation(cid) % 4 == item.actionid-1200 or isKnight(cid)))then return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") -- vocação promovida tambem recebem. elseif(item.actionid-1000 > 100 and item.actionid-1000 < 200 and not(getPlayerVocation(cid) == item.actionid-1100))then -- vocação especifica. return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") elseif(item.actionid == 1000 and not(isPaladin(cid) or isKnight(cid)))then -- somente kina ou pala recebem o item return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") elseif(item.actionid-1000 == 100 and not(isSorcerer(cid) or isDruid(cid)))then -- somente mages recebem o item return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") end elseif(item.uid > 12000 and item.actionid == 0)then -- um bau qualquer return false -- abre o bau para pegarem os items 'inside' sem marcar nada, como se fosse abrir um bau qualquer sem ser de quest. end local quests_quant = (item.actionid-100 < 1) and 1 or item.actionid-100 --Defini a quantidade de items. local playerCap,cap = getPlayerFreeCap(cid),getItemWeightById(item.uid,quests_quant) or 0 if(item.uid > 1000 and cap > 0)then if(item.actionid >= 0 and item.actionid <= 200)then --Verifica a quantidade de objetos a ser entregue. if(getSaveQuestsInfor(item.uid,cid))then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a '..((quests_quant == 1) and '' or quests_quant)..' '..getItemNameById(item.uid)..'.') saveQuestsInfor(item.uid,getItemNameById(item.uid),cid,"Quest system by uid.") doPlayerAddItemEx(cid,doCreateItemEx(item.uid, quests_quant),true) else return false,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a '..(quests_quant == 1 and '' or quests_quant)..' '..getItemNameById(item.uid)..' weighing '..math.floor(cap)..' oz it\'s too heavy.') end else--caso o player já tenha feito a quest, abri-se o baú de forma convencional, podendo obter os items que estejam dentro dele. return false end end return true end local size,rewards,items,peso = isContainer(item.uid) and getContainerSize(item.uid) or 0,'You have found a ',{},0 if(size > 0)then --Funcao nao usa marcacao (getStore...)) for i = 0, size do local tmp = getContainerItem(item.uid, i) if(tmp.itemid > 0) then --Foi feito dessa forma para nao haver conflito com items do mesmo tipo. table.insert(items,{[tmp.itemid] = tmp.type}) rewards = rewards..' '..(tmp.type > 0 and tmp.type..' charges of ' or 1)..' '..getItemNameById(tmp.itemid)..''..(i+1<size and ',' or '.') peso = peso + getItemWeight(tmp.uid) end end if(getSaveQuestsInfor(tonumber(pos.x..''..pos.y..''..pos.z),cid))then if(playerCap >= peso)then saveQuestsInfor(tonumber((pos.x)..''..(pos.y)..''..(pos.z)),getItemNameById(table.maxn(items)),cid,"Quest system by Inside.") for _,tab in pairs(items) do for k,v in pairs(tab) do doPlayerAddItemEx(cid,doCreateItemEx(k, v),true) end end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, rewards) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, rewards..' weighing '..math.floor(peso)..' oz it\'s too heavy.' ) end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") end else return false, doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is empty.") end return true end Pronto, agora vocês tem um novo sistema de quests. Se faltou algo me comuniquem e sejam felizes.
Postado Março 28, 2016 10 anos Parabéns, seu tópico de conteúdo foi aprovado! Muito obrigado pela sua contribuição, nós do Tibia King agradecemos. Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP. ➥ Regras | Seções OTServ | Seções BOT
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.