AD

[Pedido] Alavanca + Items

Por Adolfohrq, 21 de mai. de 2012 em Scripts

script
14
2.3k
AdolfohrqA
21 de maio de 2012 às 04:28

Bom pessoal, gostaria de pedir a vocês um script que o jogador tenha que colocar 2 itens em cima de 2 mesas e depois, estando em cima de um tile (460) e apertar alavanca ele sera teletransportado, para x,y,z positions!

Agradeço desde já...

jhon992J
21 de maio de 2012 às 07:58

Em actions/scripts, duplique um arquivo e nomeie para "alavancaTele" sem as aspas e nele cole:

function onUse(cid, item, fromPosition, itemEx, toPosition)

local posItens = {x=123, y=432, z=7} -- posição em que estarão os itens.
local itensCheck = {1234, 4562} -- id dos itens que devem estar na "posItens" ao apertar a alavanca.
local removeItens = true -- deve remover os itens? coloque "true" para remover ou "false" para não remover.
local posTele = {x=546, y=987, z=6} -- posição que sera teleportado caso os itens estajam certos.

local itens = {}
for i=1, #itensCheck do
    for o=1, 255 do
		    posItens = {x=posItens.x, y=posItens.y, z=posItens.z, stackpos=o}
		    if isInArray(itensCheck, getThingfromPos(posItens).itemid) then
			    itens[i] = getThingfromPos(posItens).uid
                   break
		    end
    end
end
if #itens == #itensCheck then
   if removeItens then
       for i=1, #itens do
           doRemoveItem(itens[i])
       end        
   end
   doTransformItem(item.uid, item.itemid == 10044 and 10045 or 10044) -- você deve colocar a alavanca 10044 com seu mapa editor, ou substituir esses numeros pelo id da sua alavanca virada para direita e esquerda.
   doTeleportThing(cid, posTele)
   doSendMagicEffect(posTele, CONST_ME_TELEPORT)
else
   doPlayerSendCancel(cid, "Coloque os itens corretos para teleportar!")
end

return TRUE
end

 

Agora em actions.xml cole a tag:

<action actionid="2934" script="alavancaTele.lua"/>

 

Por último é só ir na alavanca desejada com seu mapa editor e colocar o actionid=2934.

AdolfohrqA
21 de maio de 2012 às 14:10

Obrigado jhon, reputado. Você saberia fazer ao envez de telentransportar o jogador ele receber uma storage?

 

Alias ali no script que você me passou eu gostaria que fosse 2 mesas e 2 itens diferentes, ali ele teletransporta o cara com os 2 items em cima de uma mesa.. Não consegui arrumar, mas ele funciona, só da uma arrumadinha nisso pra mim porfavor?

Editado Maio 21 por adolfuu

jhon992J
22 de maio de 2012 às 09:59
function onUse(cid, item, fromPosition, itemEx, toPosition)

local posItensMesa1 = {x=123, y=432, z=7} -- posição em que estarão os itens.
local itensCheckMesa1 = {1234, 4562} -- id dos itens que devem estar na "posItensMesa1" ao apertar a alavanca.

local posItensMesa2 = {x=123, y=432, z=7} -- posição em que estarão os itens.
local itensCheckMesa2 = {1234} -- id dos itens que devem estar na "posItensMesa2" ao apertar a alavanca.

local removeItens = true -- deve remover os itens? coloque "true" para remover ou "false" para não remover.
local posTele = {x=546, y=987, z=6} -- posição que sera teleportado caso os itens estajam certos.

local itens1 = {}
local itens2 = {}
for i=1, #itensCheckMesa1 do
   for o=1, 255 do
    posItensMesa1 = {x=posItensMesa1.x, y=posItensMesa1.y, z=posItensMesa1.z, stackpos=o}
    if isInArray(itensCheckMesa1, getThingfromPos(posItensMesa1).itemid) then
	    itens1[i] = getThingfromPos(posItensMesa1).uid
	    break
    end
   end
end
for i=1, #itensCheckMesa2 do
   for o=1, 255 do
    posItensMesa2 = {x=posItensMesa2.x, y=posItensMesa2.y, z=posItensMesa2.z, stackpos=o}
    if isInArray(itensCheckMesa2, getThingfromPos(posItensMesa2).itemid) then
	    itens2[i] = getThingfromPos(posItensMesa2).uid
	    break
    end
   end
end
if #itens1 == #itensCheckMesa1 and #itens2 == #itensCheckMesa2 then
   if removeItens then
    for i=1, #itensCheckMesa1 do
	    doRemoveItem(itensCheckMesa1[i])
    end
       for i=1, #itensCheckMesa2 do
	    doRemoveItem(itensCheckMesa2[i])
    end    
   end
   doTransformItem(item.uid, item.itemid == 10044 and 10045 or 10044) -- você deve colocar a alavanca 10044 com seu mapa editor, ou substituir esses numeros pelo id da sua alavanca virada para direita e esquerda.
   doTeleportThing(cid, posTele)
   doSendMagicEffect(posTele, CONST_ME_TELEPORT)
else
   doPlayerSendCancel(cid, "Coloque os itens corretos para teleportar!")
end

return TRUE
end

AdolfohrqA
22 de maio de 2012 às 15:49

Cara, até ta funcinando porém o item (2) demora pra sumir e o (1) não some :S

VodkartV
23 de maio de 2012 às 10:37
function getItemsInPos(items, pos) -- function by vodka
local items = type(items) == "table" and items or {items}    
   local check = true 
   local t = {}
   for i = 1,#items do 
       t[i] = getThingFromPos({x=pos.x,y=pos.y,z=pos.z,stackpos=i}).itemid 
       if not table.find(items, t[i]) then 
           check = false 
       break 
       end 
   end 
 if check then 
 return true
end 
return nil 
end
function doRemoveItensInPos(items, pos) -- function by vodka
local items = type(items) == "table" and items or {items}  
     for i = 1, table.maxn(items) do 
   doRemoveItem(getThingFromPos({x=pos.x,y=pos.y,z=pos.z,stackpos=1}).uid)
 end
 return nil
end
local t = {
{items = {2175, 2376} , pos = {x=185, y=57, z=7}},
{items = {5919} , pos = {x=188, y=57, z=7}}
}
topos = {x=160, y=54, z=7}
function onUse(cid, item, fromPosition, itemEx, toPosition)
for _, k in ipairs(t) do
       if not getItemsInPos(k.items, k.pos) then
       doPlayerSendCancel(cid, 'Está faltando items na mesa.') 
return true
end
       end
       for _, v in ipairs(t) do
doRemoveItensInPos(v.items, v.pos)
end
    doTeleportThing(cid, topos)
    doSendMagicEffect(topos, CONST_ME_TELEPORT)
       doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945)
return true
end

AdolfohrqA
23 de maio de 2012 às 14:04

Vodkart, não funcionou este script, alias o item 2 sumiu e o 1 ficou intacto. E além disso o player não foi teletransportado :/, poderia rever porfavor?

VodkartV
23 de maio de 2012 às 14:06

deixa eu ver como ficou o seu script

se puder posta uma imagem do lugar tbm

vlw

AdolfohrqA
23 de maio de 2012 às 14:14

Script

 

 

function getItemsInPos(items, pos) -- function by vodka

local items = type(items) == "table" and items or {items}

local check = true

local t = {}

for i = 1,#items do

t = getThingFromPos({x=pos.x,y=pos.y,z=pos.z,stackpos=i}).itemid

if not table.find(items, t) then

check = false

break

end

end

if check then

return true

end

return nil

end

function doRemoveItensInPos(items, pos) -- function by vodka

local items = type(items) == "table" and items or {items}

for i = 1, table.maxn(items) do

doRemoveItem(getThingFromPos({x=pos.x,y=pos.y,z=pos.z,stackpos=1}).uid)

end

return nil

end

local t = {

{items = {5904,10} , pos = {x=1718, y=989, z=7}},

{items = {2195} , pos = {x=1720, y=989, z=7}}

}

topos = {x=160, y=54, z=7}

function onUse(cid, item, fromPosition, itemEx, toPosition)

for _, k in ipairs(t) do

if not getItemsInPos(k.items, k.pos) then

doPlayerSendCancel(cid, 'Está faltando items na mesa.')

return true

end

end

for _, v in ipairs(t) do

doRemoveItensInPos(v.items, v.pos)

end

doTeleportThing(cid, topos)

doSendMagicEffect(topos, CONST_ME_TELEPORT)

doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945)

return true

end

 

 

 

Foto

 

post-57647-0-68751000-1337793237_thumb.jpg

VodkartV
23 de maio de 2012 às 15:45

function getItemsInPos(items, pos) -- function by vodka
for i = 1,#items do 
local stack = getTileItemById(pos, items[i][1])
if stack.uid > 0 and math.max(1, stack.type) >= items[i][2] then
if i == #items then
check = true
end
else
check = false
end
end
return check
end
function doRemoveItensInPos(items, pos) -- function by vodka
local items = type(items) == "table" and items or {items}  
     for i = 1, table.maxn(items) do 
   doRemoveItem(getThingFromPos({x=pos.x,y=pos.y,z=pos.z,stackpos=1}).uid)
 end
 return nil
end
local t = {
{items = {{5904,10}} , pos = {x=1718, y=989, z=7}},
{items = {{2195,1}} , pos = {x=1720, y=989, z=7}}
}
topos = {x=160, y=54, z=7}
function onUse(cid, item, fromPosition, itemEx, toPosition)
for _, k in ipairs(t) do
       if not getItemsInPos(k.items, k.pos) then
       doPlayerSendCancel(cid, 'Está faltando items na mesa.') 
return true
end
       end
       for _, v in ipairs(t) do
doRemoveItensInPos(v.items, v.pos)
end
    doTeleportThing(cid, topos)
    doSendMagicEffect(topos, CONST_ME_TELEPORT)
       doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945)
return true
end

 

sobre não teleportar é pq vc esqueceu de mudar a pos para onde o jogador vai

 

muda aqui:

 

topos = {x=160, y=54, z=7}

AdolfohrqA
23 de maio de 2012 às 16:04

Funcinou perfeitamente, desculpe-me pela burrice, esqueci de mudar topos..

Vodkart, deixei uma msg em seu status, se poder dar uma olhada...

Rep + pra você, obrigado por sempre nos ajudar!

VodkartV
23 de maio de 2012 às 16:08

IUSHiushiuHSIUSHiuSIUHsiusHIUshui

velho em nem sei onde é as mensagens do status

quase nunca olho aquilo lá '-'

 

reportado para moverem

VildenV
23 de maio de 2012 às 16:10

Dúvida sanada, movido.

 

Rep+ = Vodkart

jhon992J
23 de maio de 2012 às 16:55

@adolfuu, malz aew por não poder ajudar. Tava sem internet dae nem deu de responder. Oque tinha de errado no meu script é que fiz a comparação errada. Pra arrumar bastava trocar essa linha:

if isInArray(itensCheckMesa1, getThingfromPos(posItensMesa1).itemid) then

por essa:

if  itensCheckMesa1[i] == getThingfromPos(posItensMesa1).itemid then

 

e essa:

if isInArray(itensCheckMesa2, getThingfromPos(posItensMesa2).itemid) then

por essa:

if itensCheckMesa2[i] == getThingfromPos(posItensMesa2).itemid then