Search the Community
Showing results for tags 'chest'.
-
Olá Homo-Sapiens. Resolvi trazer para vocês esse sistema de Quest que eu criei para resolver alguns inconvenientes em meu ot serv. Quais são as características dele? Ele é totalmente inserido através do mapper sem precisar criar scripts. Ele contém um sistema de parâmetros que podem ser usados para determinar a quem pode receber o prêmio. Ele não usa marcação por storage evitando assim conflitos com outros scripts que usam storage como marcação. Com esse sistema inserido vocês podem criar quest por vocação única, promovidos, mages ou kinas/palas. Como ela pode usar os items dentro do baú como items obtiveis de quest, ela aceita qualquer tipo de item inserido, mesmo keys e runas. Implementação Em actions.xml adicione: <!-- Quests baus --> <action fromid="1740" toid="1741" event="script" value="quests/quests.lua"/> <action fromid="1747" toid="1749" event="script" value="quests/quests.lua"/> <action fromid="1410" toid="1420" event="script" value="quests/quests.lua"/> <action actionid="2000" event="script" value="quests/quests.lua"/> Agora em scripts/quests crie ou modifique seu quests.lua para esse: --[[ autor = Marcryzius data = segunda-feira, 28 de Dezembro de 2015 >> Alguns parametros de uso. item.uid = itemid << id do item que será ganho - caso o item esteja 'inside' no baú, não se faz nescessario usar o id do item na uid - para habilitar o bau com os items como sendo uma quest se faz necessario acrescentar uma AID. actionid = validação << o baú 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 2000 para validar o baú 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 -- promovidos exemplo 2 = 1200 << kina e EK -- promovidos exemplo 3 = 1102 << apenas druids e não elder druids -- vocação especifica exemplo 4 = 1000 << apenas knights e paladins. exemplo 5 = 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. -- ### -- Com o uso da nova função, não está mais sendo "setado" no player a store da "quest" usando setPlayerStorageValue(). ]] function onUse(cid,item,pos) if(item.actionid >= 1000 and item.actionid < 3000)then if(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.") elseif(item.actionid-1000 > 0 and item.actionid-1000 < 100 and not(getPlayerVocation(cid) == item.actionid-1000))then -- vocação especifica - kina pala. return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") elseif(item.actionid-1000 > 100 and item.actionid-1000 < 200 and not(getPlayerVocation(cid) == item.actionid-1100))then -- vocação especifica - mages. return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") elseif(item.actionid-1000 >= 200 and item.actionid-1000 < 300 and not(getPlayerVocation(cid) % 4 == item.actionid-1200))then -- vocações promovidas. return true,doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is locked.") end elseif(item.uid > 12000 and item.actionid == 0)then -- um baú qualquer return false -- abre o baú para pegarem os items 'inside' sem marcar nada, como se fosse abrir um baú qualquer sem ser de quest. end local quests_quant = (item.actionid-100 < 1) and 1 or (item.actionid-100 > 100) and 100 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 -- quest por uid if(getSaveQuestsInfor(item.uid,cid))then --Função não usa marcação (getPlayerStore...) if(playerCap >= cap)then if(item.uid == 2493)then setPlayerStorageValue(cid,2493,1) end -- compatibilidade, verificar uso > ???...D:::H...??? 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 return true end local size,texto,rewards,peso = isContainer(item.uid) and getContainerSize(item.uid) or 0,'You have found a ',{},0 if(size > 0)then for i = size,0,-1 do local tmp = getContainerItem(item.uid, i) if(tmp.itemid > 0) then if(isItemContainer(tmp.itemid))then -- só é possível adicionar mais um inside. ou seja, uma bolsa com algo dentro desde que não tenha outra bolsa com mais coisas dentro, dentro dessa bolsa primária. table.insert(rewards,1,{[tmp.itemid] = {}}) texto = texto..' a '..getItemNameById(tmp.itemid)..''..(i+1<size and ',' or '.') for insize = getContainerSize(tmp.uid),0,-1 do local newtmp = getContainerItem(tmp.uid, insize) table.insert(rewards[1][tmp.itemid],{id=newtmp.itemid, val=(newtmp.actionid > 0 and newtmp.actionid or newtmp.type)}) end else --Foi feito dessa forma para não haver conflito com items do mesmo tipo. table.insert(rewards,{[tmp.itemid]=(tmp.actionid > 0 and tmp.actionid or tmp.type)}) if(tmp.type > 0)then texto = texto..' '..(tmp.type > 0 and tmp.type..' charges of ' or 1)..' '..getItemNameById(tmp.itemid)..''..(i+1<size and ',' or '.') elseif(tmp.actionid > 0)then texto = texto..' '..(tmp.type > 0 and tmp.type..' charges of ' or 1)..' '..getItemNameById(tmp.itemid)..''..(i+1<size and ',' or '.') else texto = texto..' '..getItemNameById(tmp.itemid)..''..(i+1<size and ',' or '.') end end peso = peso + getItemWeight(tmp.uid) end end if(getSaveQuestsInfor(tonumber(pos.x..''..pos.y..''..pos.z),cid))then --Função não usa marcação (getStore...)) if(playerCap >= peso)then for _,reward in pairs(rewards) do for item,valor in pairs(reward) do if(type(valor) == "table")then local bag = doCreateItemEx(item) for _,value in pairs(valor) do if(value and value.id > 0)then doAddContainerItemEx(bag,doCreateItemEx(value.id,(value.val<=0 and 1 or value.val))) end end doPlayerAddItemEx(cid,bag,true) elseif(isInArray(KEYS_DOOR,item))then -- se o item for uma key local ch = doCreateItemEx(item,1) doItemSetAttribute(ch,'aid',valor) doPlayerAddItemEx(cid,ch) else doPlayerAddItemEx(cid,doCreateItemEx(item, valor),true) end end end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, texto) saveQuestsInfor(tonumber((pos.x)..''..(pos.y)..''..(pos.z)),getItemNameById(table.maxn(rewards)),cid,"Quest system by Inside.") else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, texto..' 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 Em lib/050-functions.lua adicione: function getSaveQuestsInfor(uid,cid) --[[( Marcryzius )]]-- local str = false if not(db.executeQuery("SELECT * FROM `server_quests`;"))then -- caso a table não exista, será criada db.executeQuery("CREATE TABLE `server_quests` (`uid` INTEGER, `name` VARCHAR(255), `name_player` VARCHAR(255), `pos` VARCHAR(255), `other` TEXT);") return getSaveQuestsInfor(uid,cid) end 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 não exista, será criada db.executeQuery("CREATE TABLE `server_quests` (`uid` INTEGER, `name` VARCHAR(255), `name_player` VARCHAR(255), `pos` VARCHAR(255), `other` TEXT);") end -- caso o parametro uid seja numero, pega-se a posição do item ou, caso não, pega-se a posição do player. 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 -- verifica se tudo está correto. if not(type(name) == 'string') or not(tonumber(cid))then return false, print('Funcao requer parametros: name,cid') end -- salva as informações na database. 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 Exemplos de uso do sistema Quest na qual dá o prêmio de 100 gps: Quest na qual dá o prêmio apenas para knights (e não para EKs e outras promoções de knight): Quest na qual dá o prêmio apenas para paladins e suas promotions: Ressalva: Caso queira fazer para knights use o id 0 (zero) e não 4 (quatro). Quest na qual dá o prêmio apenas para todos: Nesse caso você pode usar AID 0 (zero) ou AID (2000). Caso usem o metodo 'inside' de items no baú pode-se também usar esses mesmos parâmetros para estabelecer a quem pode ganhar os items inseridos no baú. Lembre-se que em quests 'insides' não se usa UID, mantenha ela em 0 (zero): Utilizando o metodo 'inside' ela só se tornará uma quest caso tenha alguma AID para válidar como quest. Então para fazer uma validação na qual qualquer player possa obter os itens 'inside' como sendo uma quest, adicione a AID 2000 ao baú: Bem, é isso pessoal. Para finalizar, aqui vai uma crítica ao xtibia. MELHOREM ESSE SISTEMA DE EDIÇÃO DE TEXTO.
-
Galera, Há muito tempo eu havia sumido do mundo de tibia e otserv devido a vida profissional ter tomado muito de meu tempo. Durante este tempo que fiquei por aqui trabalhei em um projeto em cima do servidor opensource que eu mantinha (Vanaheim) e fiz uma versão onde tirei todas as missions e implementei alguns sistemas e paguei um desenvolvedor para fazer outros. Alguns sistemas: - Reward Chest - Equip Hotkey - Blessings - Citywars (War Antientrosa) - Tibia Store Acho um desperdício isto estar como conteúdo privado então vou disponibilizar na comunidade todo o conteúdo. Mapa global completo com sistemas integrados e Dawnport: https://github.com/brunominervino/Lucera Repositório com sistemas separados: https://github.com/brunominervino/tfs_systems Creio que não precise de scan pois os projetos estão no Github. OBS: Não atenderei nenhum pedido de suporte, até porque não tenho tempo, minha intenção é que alguém dê seguimento
-
script [Tutorial básico] Chest de quest por script
MaxxSilva posted a topic in Tutoriais de Scripting
Esse tutorial é para você criar uma chest por meio de script e adicionando um determinado level para abrir o baú então lá vai. Em action/script crie um arquivo lua com um nome da sua quest , exemplo moltresquest.lua Editando Tag em action.xml Editando a tag Por último pelo remere´s map editor , coloque uma chest no lugar desejado e em "properties" coloque no Unique ID número do unique que você colocou no script. Bom se a área estiver errada podem mover porfavor. Obrigado pela compreensão MaxxSila -
Aí galera, será que alguém poderia me mandar um script no qual um player ao usar um chest ganhasse um outfit e a depender se o char é male ou female, verificasse o sexo e adicionasse os outfits diferentes? Eu quero colocar dois novos outfits a partir de looktype dos próprios monstros, um vai ser para male, outro para female. Queria que o outfit fosse adicionado nessa parte, que é uma parte do script da anihi. No caso, ao invés do anihilator bear, daria o outfit. elseif item.uid == 5003 then queststatus = getPlayerStorageValue(cid,6078) if queststatus == -1 then doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR, "You have found a present.") local bag = doPlayerAddItem(cid,1990,1) doAddContainerItem(bag,2326,1) setPlayerStorageValue(cid,6078,1) else doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR, "It is empty.") end end return 1 end Então, será que alguém poderia ajudar? Rep + ^^