Ir para conteúdo

Featured Replies

Postado

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.

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