Postado Março 28, 2016 9 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 9 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.