Olá, irei mostrar aqui uma forma de fazer uma área de treino segura para os players, usando o map editor (sério!?) e scripts. O tutorial está longo mais por causa da explicação dos scripts, quem já sabe configurar isso é só olhar a idéia mesmo.
Como assim "segura"?
Sabe quando você quer treinar em paz, mas vem um PK, vê que você está AFK e te mata? Pois é, com essa minha idéia você nunca mais terá esse problema!
Sem mais delongas, vamos começar.
Primeio, faça a área no map editor da seguinte forma:
(use o estilo que quiser)
Indicado com as flechas retas, está o destino dos teleports.
A janela se destaca por estar FECHADA, pois assim não tem como atirar runas ou bolts.
Ao usar a alavanca, a grade aparecerá, bloqueando a entrada no bloco de treino.
Scripts:
(nesse script fiz como se houvesse apenas 2 blocos a ser fechados)
Crie um arquivo .lua com o nome desejado na sua pasta data/actions/scripts (usarei o nome "levers_trainareas.lua")
function onUse(cid, item, frompos, item2, topos) wall1 = {x=115, y=30, z=7, stackpos=1} wall2 = {x=118, y=30, z=7, stackpos=1} getwall1 = getThingfromPos(wall1) getwall2 = getThingfromPos(wall2) --bloco 1 if item.uid == 8005 and item.itemid == 1945 and getwall5.itemid == 0 and getwall5.itemid == 0 then doCreateItem(1547,1,wall5) doTransformItem(item.uid,item.itemid+1) elseif item.uid == 8005 and item.itemid == 1946 and getwall5.itemid == 1547 and getwall5.itemid == 1547 then doRemoveItem(getwall5.uid,1) doTransformItem(item.uid,item.itemid-1) --bloco 2 elseif item.uid == 8006 and item.itemid == 1945 and getwall6.itemid == 0 and getwall6.itemid == 0 then doCreateItem(1547,1,wall6) doTransformItem(item.uid,item.itemid+1) elseif item.uid == 8006 and item.itemid == 1946 and getwall6.itemid == 1547 and getwall6.itemid == 1547 then doRemoveItem(getwall6.uid,1) doTransformItem(item.uid,item.itemid-1) else doPlayerSendCancel(cid,"Algo esta bloqueando a grade.") end return 1 end
Entendendo o código:
wall1 = {x=115, y=30, z=7, stackpos=1} wall2 = {x=118, y=30, z=7, stackpos=1}
Cada "wall" representa uma grade.
No bloco número 1 a grade será wall1, e no bloco 2 será wall2.
No x, y e z que aparecem você deve colocar as coordenadas do lugar onde aparecerá a GRADE de cada bloco.
getwall1 = getThingfromPos(wall1) getwall2 = getThingfromPos(wall2)
Para cada wall você deverá colocar um getwall, que irá pegar a coordenada do wall descrito
para a wall1 temos o getwall1, veja: getwall1 = getThingfromPos(wall1)
if item.uid == 8001 and item.itemid == 1945 and getwall1.itemid == 0 and getwall1.itemid == 0 then doCreateItem(1547,1,wall1) doTransformItem(item.uid,item.itemid+1) elseif item.uid == 8001 and item.itemid == 1946 and getwall1.itemid == 1547 and getwall1.itemid == 1547 then doRemoveItem(getwall1.uid,1) doTransformItem(item.uid,item.itemid-1)
Aqui iniciamos os comandos para criação da grade, e também para tirá-la quando a alavanca for ativada.
if item.uid == 8001
Quando aparecer isso, no lugar de 8001 você deve colocar o UniqueID da alavanca do bloco (nesse caso seria o bloco 1).
and getwall1.itemid == 0 and getwall1.itemid == 0 then
Aqui você deve trocar o numero do getwall pelo correspondente do bloco, nesse caso é o 1 mesmo.
Nesse código, você diz que no lugar onde aparecerá a grade nao deve ter nenhum item, por isso o id "0", ou seja, nada.
doCreateItem(1547,1,wall1)
Cria a grade de ID 1547, na posição wall1 (óbviamente você não é obrigado a usar essa grade, você pode usar qualquer parede, apenas troque o ID).
getwall1.itemid == 1547 and getwall1.itemid == 1547 then
Siginifica que para retirar a grade, no sqm que ela está deve estar apenas a grade (ID 1547). Note que se você usar outra parede, você deverá substituir esse ID pelo o da parede usada.
doRemoveItem(getwall1.uid,1)
Remove a grade da posição getwall1.
else doPlayerSendCancel(cid,"Algo esta bloqueando a grade.") end return 1 end
Aqui, indicamos a mensagem que será enviada ao player caso algum item esteja no lugar de onde deve aparecer a grade. Você pode escrever qualquer coisa, desde que esteje dentro das aspas, e lembre-se de não colocar acentos ou cedilha.
A cada grade você deverá criar um wall, um getwall para o wall, e um script inteiro como esse;
elseif item.uid == 8002 and item.itemid == 1945 and getwall2.itemid == 0 and getwall2.itemid == 0 then doCreateItem(1547,1,wall2) doTransformItem(item.uid,item.itemid+1) elseif item.uid == 8002 and item.itemid == 1946 and getwall2.itemid == 1547 and getwall2.itemid == 1547 then doRemoveItem(getwall2.uid,1) doTransformItem(item.uid,item.itemid-1)
onde você deverá editar os números para que ocorra tudo certo.
elseif item.uid == 8002 and item.itemid == 1945 and getwall2.itemid == 0 and getwall2.itemid == 0 then
VEJA QUE ADICIONAMOS "else" JUNTO AO "if" QUANDO ESSE NÃO FOR O PRIMEIRO BLOCO! APENAS O PRIMEIRO BLOCO DEVE COMEÇAR COM "if"!
Agora em data/actions/actions.xml, insira:
<action uniqueid="8001" script="levers_trainarea.lua" />
Note que para cada alavanca você deve botar uma linha igual essa com o UniqueID da alavanca. Se tivéssemos 3 alavancas seria assim (note a mudança dos UniqueIDs):
<action uniqueid="8001" script="levers_trainarea.lua" />
<action uniqueid="8002" script="levers_trainarea.lua" />
<action uniqueid="8003" script="levers_trainarea.lua" />
Assim, o player entra no bloquinho com a alavanca, aciona ela e fecha seu bloco, teleporta-se para os montros e treina em paz sem perigo de ser atacado.
Lembre-se que se a parede for vertical, você deverá usar o id da grade (ou parede escolhida) na posição vertical, no caso da grade, seria ID 1546.
Créditos: Ajcmaster