TH
dúvida

Ajuda Doton Prision (Magic wall nao some)

Por Thiach, 10 de abr. de 2013 em Scripts

resolvido
tibia
script
otserv
13
3.2k
ThiachT
10 de abril de 2013 às 13:00

Galera, que bug tosco que estou aqui..

 

O script estava funcionando perfeitamente ontem, nao mechi em nada que possa te-lo alterado, ja conferi as sources e nao é, os tibia spr e dat tbm não.. o script ta intacto porém a id da magic wall nao está sumindo agora, nao mexi nos items.xml, nem nada que possa ter afetado, o script estava funcionando 100% ,nao sei o que houve alguem poderia dar um help?

 

Spell:


local remove_time = 5 -- tempo em segundos para remover as magic wall
local item_id = 5750 -- id da magic wall

function onCastSpell(cid, var)

local pos = getThingPosition(getCreatureTarget(cid))
posTile1 = {x=pos.x+1,y=pos.y+1,z=pos.z,stackpos=1}
posTile2 = {x=pos.x+1,y=pos.y,z=pos.z,stackpos=1}
posTile3 = {x=pos.x+1,y=pos.y-1,z=pos.z,stackpos=1}
posTile4 = {x=pos.x,y=pos.y-1,z=pos.z,stackpos=1}
posTile5 = {x=pos.x-1,y=pos.y-1,z=pos.z,stackpos=1}
posTile6 = {x=pos.x-1,y=pos.y,z=pos.z,stackpos=1}
posTile7 = {x=pos.x-1,y=pos.y+1,z=pos.z,stackpos=1}
posTile8 = {x=pos.x,y=pos.y+1,z=pos.z,stackpos=1}
posAll = {posTile1,posTile2,posTile3,posTile4,posTile5,posTile6,posTile7,posTile8}

for i=1, #posAll do
if isWalkable(posAll[i]) then
doCreateItem(item_id, 1, posAll[i])
end
end
addEvent(removeItem, remove_time*1000, posAll)

return true
end

function isWalkable(pos, creature, pz, proj)
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
local creature = getTopCreature(pos)
if creature.type > 0 then return false end
if getTilePzInfo(pos) and not pz then return false end
local n = not proj and 3 or 2
for i = 0, 255 do
	pos.stackpos = i
	local tile = getTileThingByPos(pos)
	if tile.itemid ~= 0 and not isCreature(tile.uid) then
		if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
			return false
		end
	end
end
return true
end

function removeItem(posAll)
for i=1, #posAll do
for j=0, 255 do
pos_stack = {x=posAll[i].x,y=posAll[i].y,z=posAll[i].z,stackpos=j}
removeTile = getThingfromPos(pos_stack)
if removeTile.itemid == item_id then
doRemoveItem(removeTile.uid)
end
end
end
end

 

Valendo rep+ ae

RoksasR
10 de abril de 2013 às 13:06

Tenta ae

 

 

function onCastSpell(cid, var)

 

local function removeItem(posAll)

for i=1, #posAll do

for j=0, 255 do

pos_stack = {x=posAll.x,y=posAll.y,z=posAll.z,stackpos=j}

removeTile = getThingfromPos(pos_stack)

if removeTile.itemid == item_id then

doRemoveItem(removeTile.uid)

end

return true

end

end

end

 

local remove_time = 5 -- tempo em segundos para remover as magic wall

local item_id = 5750 -- id da magic wall

 

local pos = getThingPosition(getCreatureTarget(cid))

posTile1 = {x=pos.x+1,y=pos.y+1,z=pos.z,stackpos=1}

posTile2 = {x=pos.x+1,y=pos.y,z=pos.z,stackpos=1}

posTile3 = {x=pos.x+1,y=pos.y-1,z=pos.z,stackpos=1}

posTile4 = {x=pos.x,y=pos.y-1,z=pos.z,stackpos=1}

posTile5 = {x=pos.x-1,y=pos.y-1,z=pos.z,stackpos=1}

posTile6 = {x=pos.x-1,y=pos.y,z=pos.z,stackpos=1}

posTile7 = {x=pos.x-1,y=pos.y+1,z=pos.z,stackpos=1}

posTile8 = {x=pos.x,y=pos.y+1,z=pos.z,stackpos=1}

posAll = {posTile1,posTile2,posTile3,posTile4,posTile5,posTile6,posTile7,posTile8}

 

for i=1, #posAll do

if isWalkable(posAll) then

doCreateItem(item_id, 1, posAll)

end

end

addEvent(removeItem, remove_time*1000)

 

return true

end

 

function isWalkable(pos, creature, pz, proj)

if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end

local creature = getTopCreature(pos)

if creature.type > 0 then return false end

if getTilePzInfo(pos) and not pz then return false end

local n = not proj and 3 or 2

for i = 0, 255 do

pos.stackpos = i

local tile = getTileThingByPos(pos)

if tile.itemid ~= 0 and not isCreature(tile.uid) then

if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then

return false

end

end

end

return true

end

 

ThiachT
10 de abril de 2013 às 13:45

Opa, deu esse erro aqui:

 

 

[10/04/2013 13:43:11] [Error - Spell Interface] 
[10/04/2013 13:43:11] In a timer event called from: 
[10/04/2013 13:43:11] data/spells/scripts/kakashi/prision.lua:onCastSpell
[10/04/2013 13:43:11] Description: 
[10/04/2013 13:43:11] data/spells/scripts/kakashi/prision.lua:4: attempt to get length of local 'posAll' (a nil value)
[10/04/2013 13:43:11] stack traceback:
[10/04/2013 13:43:11]  data/spells/scripts/kakashi/prision.lua:4: in function <data/spells/scripts/kakashi/prision.lua:3>

 

e a magic wall tbm nao removeu =x

drakylucasD
10 de abril de 2013 às 14:03

local remove_time = 5 -- tempo em segundos para remover as magic wall
local item_id = 5750 -- id da magic wall

function onCastSpell(cid, var)

local pos = getThingPosition(getCreatureTarget(cid))
posTile1 = {x=pos.x+1,y=pos.y+1,z=pos.z,stackpos=1}
posTile2 = {x=pos.x+1,y=pos.y,z=pos.z,stackpos=1}
posTile3 = {x=pos.x+1,y=pos.y-1,z=pos.z,stackpos=1}
posTile4 = {x=pos.x,y=pos.y-1,z=pos.z,stackpos=1}
posTile5 = {x=pos.x-1,y=pos.y-1,z=pos.z,stackpos=1}
posTile6 = {x=pos.x-1,y=pos.y,z=pos.z,stackpos=1}
posTile7 = {x=pos.x-1,y=pos.y+1,z=pos.z,stackpos=1}
posTile8 = {x=pos.x,y=pos.y+1,z=pos.z,stackpos=1}
posAll = {posTile1,posTile2,posTile3,posTile4,posTile5,posTile6,posTile7,posTile8}

for i=1, #posAll do
if isWalkable(posAll[i]) then
doCreateItem(item_id, 1, posAll[i])
end
end
addEvent(removeItem, remove_time*1000, posAll)

return true
end

function isWalkable(pos, creature, pz, proj)
       if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
local creature = getTopCreature(pos)
       if creature.type > 0 then return false end
if getTilePzInfo(pos) and not pz then return false end
local n = not proj and 3 or 2
for i = 0, 255 do
               pos.stackpos = i
               local tile = getTileThingByPos(pos)
               if tile.itemid ~= 0 and not isCreature(tile.uid) then
                       if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                               return false
                       end
               end
end
return true
end

function removeItem(posAll)
local item = 0
for i=1, #posAll do
item = getTileItemById(posAll[i], item_id).uid
if item > 0 then
  doRemoveItem(item)
end
end
end

 

testa ae e posta o resultado :D

ThiachT
10 de abril de 2013 às 14:11

Nao deu nenhum erro mais tbm nao removeu a magic wall.

 

Olha, no meus items .xml essa id 5750 é uma rocks, mais nao tem duration nela, antes funcionava 100% e removia, e dps parou de funcionar do nada isso vey, que estranho..

 

ta dificil resolver esse bug tosco, =x

10 de abril de 2013 às 14:11

Seguinte, voce poderia ver a sprite do item que voce quer no dat editor, depois criar um novo item no Item.OTB com a sprite escolhida, ir no Items.xml e adicionar um decay 0 na tag do item, ai voce só escolheria o tempo que ela iria sumir ou não e na spell era só colocar pro item que foi escolhido aparecer em volta do target.

 

Não sei se irá entender , mais enfim ... aqui fiz assim.

ThiachT
10 de abril de 2013 às 14:13

Eu entendi, estava pensando em fazer isso mesmo se nao conseguise, mais eu queria mesmo saber o motivo desse bug, e resolver tbm..

 

Pq nao é possivel uma coisa dessas, nao tem explicação pra isso, nao é o .exe, nem nada, nao mexi em nada velho, mtu estranho.. se nao conseguir resolver de jeito nenhum e se ngm tiver 1 soluçao eu faço isso msm.. ta foda=/

drakylucasD
10 de abril de 2013 às 14:20

não tem sentido não estar sumindo oO

 

posso refazer a magia com a mesma funcionalidade, só que do meu jeito?

 

teste:

 

function isWalkable(pos, creature, pz, proj)
	if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
local creature = getTopCreature(pos)
	if creature.type > 0 then return false end
if getTilePzInfo(pos) and not pz then return false end
local n = not proj and 3 or 2
for i = 0, 255 do
			pos.stackpos = i
			local tile = getTileThingByPos(pos)
			if tile.itemid ~= 0 and not isCreature(tile.uid) then
					if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
							return false
					end
			end
end
return true
end
function onCastSpell(cid, var)
local pos = getThingPosition(getCreatureTarget(cid))
for x = -1,1 do
 for y = -1,1 do
 if x ~= 0 and y ~= 0 then
	posicao = {x = pos.x + x, y = pos.y + y, z = pos.z}
	if isWalkable(posicao) then
	   doCreateItem(5750,1,posicao)
	end
 end
 end
end
addEvent(function()
for x = -1,1 do
 for y = -1,1 do
 if x ~= 0 and y ~= 0 then
	posicao = {x = pos.x + x, y = pos.y + y, z = pos.z}
	if getTileItemById(posicao, 5750).uid > 0 then
	   doRemoveItem(getTileItemById(posicao, 5750).uid)
	end
 end
 end
end
end,5*1000)
return true
end

Editado Abril 10 por DrakyLucas

ThiachT
10 de abril de 2013 às 14:25

Aee sumiu , so que os positions das rocks nao estão certas, ta tipo assim agora:

 

{1, 0, 1}

{0, 3, 0

{1, 0, 1}

 

antes cobria uma trap inteira

drakylucasD
10 de abril de 2013 às 14:30

pera é algo no for entao.. vou arrumar e ja edito kk

 

function isWalkable(pos, creature, pz, proj)
		    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
local creature = getTopCreature(pos)
		    if creature.type > 0 then return false end
if getTilePzInfo(pos) and not pz then return false end
local n = not proj and 3 or 2
for i = 0, 255 do
						    pos.stackpos = i
						    local tile = getTileThingByPos(pos)
						    if tile.itemid ~= 0 and not isCreature(tile.uid) then
										    if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
														    return false
										    end
						    end
end
return true
end
function onCastSpell(cid, var)
local pos = getThingPosition(getCreatureTarget(cid))
for x = -1,1 do
 for y = -1,1 do
		    posicao = {x = pos.x + x, y = pos.y + y, z = pos.z}
		    if isWalkable(posicao) and posicao ~= {x = pos.x,y = pos.y,z = pos.z} then
			   doCreateItem(5750,1,posicao)
		    end
 end
end
addEvent(function()
for x = -1,1 do
 for y = -1,1 do
		    posicao = {x = pos.x + x, y = pos.y + y, z = pos.z}
		    if getTileItemById(posicao, 5750).uid > 0 then
			   doRemoveItem(getTileItemById(posicao, 5750).uid)
		    end
 end
end
end,5*1000)
return true
end

 

teste agora

ThiachT
10 de abril de 2013 às 14:42

Aewww vey! 100% como tava antes de bugar, vlw ae, como vc conseguiu? kkk

 

REP+ pra vc ae

RoksasR
10 de abril de 2013 às 14:51

Tópico movido para a seção de dúvidas e pedidos resolvidos.

5 anos depois...
XtudomuitoX
11 de junho de 2018 às 21:11

Gostei