Postado Abril 11, 2014 11 anos Este é um post popular. Hoje vou ensinar vocês a fazer uma quest com bastante RPG (e com um pouquinho de esforço talvez o melhor sistema já visto num OTSERV!!)É uma quest que você tem um determinado tempo pra matar um monstro e entrar num teleporte ou a passagem será bloqueada "tá, mas oque difere essa quest de qualquer script de arena que tenha aí pelo fórum?" na verdade nada, mas no meu server eu coloquei um tempo bem ridículo (8 segundos) e é tecnicamente impossível chegar do outro lado. "então você fez uma quest que não dá pra fazer, é isso mesmo?" não meu caro amigo, é uma quest que foi feita pra ser pensada. Um dos players entra na quest e termina ela, daí outro player ativa a alavanca e ele passa.. fazendo com que o pessoal só consiga passar com a ajuda de um amigo. Se você conseguir trabalhar em equipe em prol de um prêmio a sua recompensa é a oportunidade de fazer um pacto com as trevas. "masoque??" isso mesmo que você entendeu, você ganha a chance de abrir mão da sua vida (literalmente) pra receber uma spell nova. ~~ Hoje eu vou ensinar a reproduzirem esse sistema caralhudo no server de vocês: Tudo começa no map editor quando você vai fazer uma área + ou - igual a essa e colocar os seguintes actions/unique ids Agora vamos aos scripts: actions\scripts\newquest.lua function onUse(cid, item, frompos, item2, topos) local tempo = 8000 local wall1 = {x=612, y=345, z=7, stackpos=1} local pos1 = getThingfromPos(wall1) local wall2 = {x=653, y=345, z=7, stackpos=1} local pos2 = getThingfromPos(wall2) local monster1 = {x=615, y=345, z=7, stackpos=1} local posmonster1 = getThingfromPos(monster1) local monster3 = {x=654, y=345, z=7, stackpos=1} local idparede = 9788 local alavanca = {x=610, y=344, z=7, stackpos=1} local alavancapos = getThingfromPos(alavanca) function wait1(wall1) doCreateItem(idparede,1,wall1) end function wait2(wall2) doCreateItem(idparede,1,wall2) end function wait3(alavanca) doTransformItem(item.uid,1946) end if item.uid == 7777 and item.itemid == 1945 then if pos1.itemid ~= 0 and pos2.itemid ~= 0 then doRemoveItem(pos1.uid,5) doSendMagicEffect(pos1,12) doRemoveItem(pos2.uid,5) doSendMagicEffect(pos2,12) doCreateMonster("Juggernaut",monster1) doSendMagicEffect(monster1,13) doPlayerSendTextMessage(cid,25, "You have ".. tempo/1000 .." seconds to finish the quest") addEvent(wait1,tempo,wall1) addEvent(wait2,tempo,wall2) addEvent(wait3,tempo,alavanca) else doPlayerSendCancel(cid,"You can't start the quest twice.") end elseif item.uid == 7777 and item.itemid == 1946 then doTransformItem(item.uid,item.itemid-1) for x = monster1.x, monster3.x do for y = monster1.y, monster3.y do for z = monster1.z, monster3.z do local mob = getTopCreature({x=x, y=y, z=z}).uid if mob ~= 0 and isMonster(mob) then doRemoveCreature(mob) else doPlayerSendCancel(cid,"Sorry, not possible.") end end end return true end end return true end actions\scripts\newquest2.lua function onUse(cid) local topos = {x=609, y=345, z=7, stackpos=1} if doTeleportThing(cid, topos) then doPlayerSendTextMessage(cid,19, "You have failed at my quest.") doSendMagicEffect(topos,10) end end agora no actions.xml <action uniqueid="7777" script="newquest.lua"/> <action actionid="6666" script="newquest2.lua"/> Feito isso você vai precisar preparar uma sala aonde o player será teleportado caso ele consiga passar e coloque uma alavanca nessa sala. Na alavanca você deve colocar o actionid 6102 e uma plaquinha explicando sobre o pacto daí você adiciona isso no actions.xml <action actionid="6102" script="alavanca de magia.lua"/> e crie o script 'alavanca de magia.lua' que deverá conter o seguinte: function onUse(cid, item) local magia = "Target Spell" local vida = 200 -- quanto de vida vai remover da vida total if getPlayerLearnedInstantSpell(cid, magia) then doPlayerSendTextMessage(cid,25,"You are already in a pact with the Darkness.") elseif doPlayerLearnInstantSpell(cid, magia) then local pos = getCreaturePosition(cid) local hp = getCreatureMaxHealth(cid)-vida doSendAnimatedText(pos, "-"..vida , 180) setCreatureMaxHealth(cid, hp) doCreatureAddHealth(cid, -vida, COMBAT_LIFEDRAIN) doSendMagicEffect(pos, 0) doPlayerSendTextMessage(cid,19,"By switching the lever you agreed to let the darkness in and received the powers of "..magia..".") end end Feito tudo isso agora só falta criar a magia Target Spell que no caso é essa daqui: --obs: essa spell foi feita se não me engano pelo Jhon992, em todo caso tá aqui o crédito do cara local config = { jumps = 15, walktime = 500 } combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, 66) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -15, 5, 5, 1.8, 3, -20, -40) function onCastSpell(cid) function move(cid, pos, n) local n = n or 0 if (n < config.jumps) then if (isCreature(cid)) then local pos = pos or getCreaturePosition(cid) local target = getCreatureTarget(cid) local dir = (target ~= 0) and getDirectionTo(pos, getCreaturePosition(target)) or getCreatureLookDirection(cid) local tpos = (target ~= 0) and getCreaturePosition(target) local newPos if ((target ~= 0) and ((pos.x == tpos.x) and (pos.y == tpos.y))) then newPos = tpos else newPos = getPosByDir(pos, dir) end if ((getTopCreature(newPos).uid == 0) and doTileQueryAdd(cid, newPos) ~= 1) then return false end doCombat(cid, combat, { pos = newPos, type = 2 }) addEvent(move, config.walktime, cid, newPos, n + 1) end end end move(cid) return true end e colocar no spells.xml: <instant name="Target Spell" words="exevo res" lvl="120" maglv="10" mana="500" exhaustion="3000" prem="0" needlearn="1" script="especiais/seguidor.lua"> <vocation id="6"/> <vocation id="7"/> <vocation id="5"/> <vocation id="8"/> </instant> FIM. Agora você só precisa editar as actions pra rodarem de acordo com as posições do seu server então vamos às explicações: SCRIPT1:local tempo = 8000 ---- tempo até a porta fechar local wall1 = {x=612, y=345, z=7, stackpos=1} -- local da primeira pedra local pos1 = getThingfromPos(wall1) local wall2 = {x=653, y=345, z=7, stackpos=1} --- local da segunda pedra local pos2 = getThingfromPos(wall2) local monster1 = {x=615, y=345, z=7, stackpos=1} --- local que cria o monstro, no caso eu uso o Juggernaut mas vc pode editar dentro do script local posmonster1 = getThingfromPos(monster1) local monster3 = {x=654, y=345, z=7, stackpos=1} --- Ultima posição antes do teleporte, serve pra remover o monstro local idparede = 9788 --- id do obstáculo q será criado local alavanca = {x=610, y=344, z=7, stackpos=1} -- POSIÇÃO DA ALAVANCA local alavancapos = getThingfromPos(alavanca) SCRIPT2:local topos = {x=609, y=345, z=7, stackpos=1} -- posição que vai ser teleportado caso clique na alavanca de 'FAIL QUEST' Espero que vocês tenham curtido Aqui tem mais duas imagens pra vocês Alavanca: Magia: EXPLICANDO A MAGIA: Os morcegos seguem a direção que você tá olhando, se vc tiver um target eles seguem o target. Editado Abril 11, 2014 11 anos por xWhiteWolf (veja o histórico de edições)
Postado Abril 11, 2014 11 anos O meu fica dando erro, fica falando que está não está achando o arquivo msvcp100.dl
Postado Junho 20, 2014 10 anos Olá, desculpe reviver o tópico, mas seu sistema é perfeito para meu ot (FoxWorld 8.4). Tenho um pequeno probleminha , é assim: Quando o player some da tela (no caso fica sem target) o script(apenas a magia) da um erro, pois precisa do target para segui-lo. o erro que da é esse: [20/06/2014 18:04:17] Lua Script Error: [Spell Interface] [20/06/2014 18:04:17] in a timer event called from: [20/06/2014 18:04:17] data/spells/scripts/vip/target spell.lua:onCastSpell [20/06/2014 18:04:17] data/spells/scripts/vip/target spell.lua:21: attempt to call global 'getCreatureLookDirection' (a nil value) [20/06/2014 18:04:18] stack traceback: [20/06/2014 18:04:18] data/spells/scripts/vip/target spell.lua:21: in function <data/spells/scripts/vip/target spell.lua:15> Basicamente eu gostaria de pedir para arrumar o script da magia (se possível ) para continuar seguindo o player mesmo fora do target, ou, para o script parar/encerrar quando o target for perdido. Dês de já, obrigado. Editado Junho 20, 2014 10 anos por eviltox (veja o histórico de edições)
Postado Junho 23, 2014 10 anos Autor testa agora: --obs: essa spell foi feita se não me engano pelo Jhon992, em todo caso tá aqui o crédito do cara local config = { jumps = 15, walktime = 500 } combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, 66) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -15, 5, 5, 1.8, 3, -20, -40) function onCastSpell(cid) function move(cid, pos, n) local n = n or 0 if (n < config.jumps) then if (isCreature(cid)) then local pos = pos or getCreaturePosition(cid) if getCreatureTarget(cid) then local target = getCreatureTarget(cid) else local target == 0 end local dir = (target ~= 0) and getDirectionTo(pos, getCreaturePosition(target)) or getCreatureLookDirection(cid) local tpos = (target ~= 0) and getCreaturePosition(target) local newPos if ((target ~= 0) and ((pos.x == tpos.x) and (pos.y == tpos.y))) then newPos = tpos else newPos = getPosByDir(pos, dir) end if ((getTopCreature(newPos).uid == 0) and doTileQueryAdd(cid, newPos) ~= 1) then return false end doCombat(cid, combat, { pos = newPos, type = 2 }) addEvent(move, config.walktime, cid, newPos, n + 1) end end end move(cid) return true end
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.