Ir para conteúdo
  • Cadastre-se

Posts Recomendados

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.

 

quest_apenas_sorcerer.jpg

 

quest_sorcerer.jpg

 

 

quest_druid.jpg

 

quests_knight_promot.jpg

 

quests_kina_pala.jpg

 

quests_velho_sistema.jpg

 

 

quest_simples.jpg

 

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.

Link para o post
Compartilhar em outros sites

51mutNo.png 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.

Link para o post
Compartilhar em outros sites

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

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.


  • Conteúdo Similar

    • Por Tricoder
      Preview

       
      Script
      data/items/items.xml
      <item id="8981" article="a" name="gold premium card"> <attribute key="weight" value="0" /> <attribute key="description" value="Use this card to receive 7 premium days." /> </item> data/actions/actions.xml
      <action itemid="8981" script="other/premiumcard.lua"/> data/actions/scripts/premium_card
      local t = { days = 7, effect = CONST_ME_HOLYAREA } function onUse(cid, item, fromPosition, itemEx, toPosition) doPlayerRemoveItem(cid, 8981, 1) return TRUE, doPlayerAddPremiumDays(cid, t.days), doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You now have +" .. t.days .. " premium days!"), doSendMagicEffect(fromPosition, t.effect) end Créditos: God Mythera
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo