Ir para conteúdo
  • 0

Ajuda num pequeno ajuste de um script


4sharedddd

Pergunta

Bom eu tenho esse script aqui, consiste em colocar o item (checkitems) em um tile configuravel no script e retira o item e da o addo, bom eu precisava que fosse um item ou outro item.

por exemplo a pessoa podia pegar o addon com dois itens diferentes tanto com o x item quanto com o y, se eu coloco isso no script ele diz que precisa de 2 itens, como eu faço pra ser um ou outro?

local c = {
    checkItems = {[2656] = 1, [5880] = 100}, -- [itemId] = quantidade
    checkPlaces = {{x=175, y=392, z=10}, {x=175, y=394, z=10}}, -- posicoes
    addons = {{145, 149}, name = "Wizard Addon"}, -- {addon female/male}, nome do outfit
    storage = 21003,
    level = 0
}
local function getTableMax(t)
    local ret = 0
    for _, i in pairs(t) do
        ret = ret + 1
    end
    return ret
end
function onUse(cid, item, fromPosition, itemEx, toPosition)
    if(getPlayerStorageValue(cid, c.storage) == -1) then
        if(getPlayerLevel(cid) > c.level) then
            local done = {}
            for n, pos in pairs(c.checkPlaces) do
                for itemId, count in pairs(c.checkItems) do
                    local posItem = getTileItemById(pos, itemId)
                    if(posItem.uid ~= 0 and (count == 1 or posItem.type >= count) and not done[itemId]) then
                        done[itemId] = {count, pos}
                        break
                    end
                end
            end
            if(getTableMax(done) == getTableMax(c.checkItems)) then
                for i, t in pairs(done) do
                    doRemoveItem(getTileItemById(t[2], i).uid, t[1])
                    doSendMagicEffect(t[2], CONST_ME_FIREAREA)
                end
                setPlayerStorageValue(cid, c.storage, 1)
                for i = 1, #c.addons[1] do
                    doPlayerAddOutfit(cid, c.addons[1], 3)
                end
                doPlayerSendTextMessage(cid, 21, "You just earned the "..(c.addons.name)..".")
            else
                doPlayerSendCancel(cid, "You need all itens.")
            end
        else
            doPlayerSendCancel(cid, "You need level "..(c.level)..".")
        end
    else
        doPlayerSendCancel(cid, "You have already completed this addon.")
    end
    return true
end
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

O seguinte escopo está sujeito a alguns erros:

for id, count in pairs(c.checkItems) do
    if getTileItemById(c.checkPlace, id).count >= count then
        doRemoveItem(getTileItemById(c.checkPlace, id).uid, count)
        doSendMagicEffect(c.checkPlace, CONST_ME_POFF)
        doPlayerSetStorageValue(cid, c.storage, 1)
        doTeleportThing(cid, c.teleport)
        doSendMagicEffect(getThingPos(cid), 10)
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce sacrificou o corpo de um belo jovem, uma pena... mas for preciso.")
    else
        PlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce precisa colocar corpo de alguem na chama roxa do inferno.")
    end
end
Se não se importa, aqui está a correção que escrevi:
for id, count in pairs(c.checkItems) do
    local item = getTileItemById(c.checkPlace, id)
 
    if item.uid > 0 and item.type >= count then
        doRemoveItem(item.uid, count)
        doSendMagicEffect(c.checkPlace, CONST_ME_POFF)
        doPlayerSetStorageValue(cid, c.storage, 1)
        doTeleportThing(cid, c.teleport)
        doSendMagicEffect(getThingPos(cid), 10)
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce sacrificou o corpo de um belo jovem, uma pena... mas for preciso.")
        return true
    end
end
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce precisa colocar corpo de alguem na chama roxa do inferno.")

 

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0
por exemplo a pessoa podia pegar o addon com dois itens diferentes tanto com o x item quanto com o y, se eu coloco isso no script ele diz que precisa de 2 itens, como eu faço pra ser um ou outro?

 

Claro tá comparando o tamanho das tables...

Você não precisa de getTableMax para saber o tamanho da tabela, é só você colocar um ( # ) na frente do nome dela... #table -> retorna o tamanho da table.

 

 

Tenta isso:

local c = {
    checkItems = {[2656] = 1, [5880] = 100}, -- [itemId] = quantidade
    checkPlaces = {{x=175, y=392, z=10}, {x=175, y=394, z=10}}, -- posicoes
    addons = {{145, 149}, name = "Wizard Addon"}, -- {addon female/male}, nome do outfit
    storage = 21003,
    level = 0
}
local function getTableMax(t)
    local ret = 0
    for _, i in pairs(t) do
        ret = ret + 1
    end
    return ret
end
function onUse(cid, item, fromPosition, itemEx, toPosition)
    if(getPlayerStorageValue(cid, c.storage) == -1) then
        if(getPlayerLevel(cid) > c.level) then
            local done = {}
            for n, pos in pairs(c.checkPlaces) do
                for itemId, count in pairs(c.checkItems) do
                    local posItem = getTileItemById(pos, itemId)
                    if(posItem.uid ~= 0 and (count == 1 or posItem.type >= count) and not done[itemId]) then
                        done[itemId] = {count, pos}
                    end
                end
            end
            
            for k, v in pairs(done) do 
                if (isInArray(c.checkItems, v) and c.checkItems[k]) then 
                    for i, t in pairs(done) do
                        doRemoveItem(getTileItemById(t[2], i).uid, t[1])
                        doSendMagicEffect(t[2], CONST_ME_FIREAREA)
                    end
                    setPlayerStorageValue(cid, c.storage, 1)
                    for i = 1, #c.addons[1] do
                        doPlayerAddOutfit(cid, c.addons[1], 3)
                    end
                    doPlayerSendTextMessage(cid, 21, "You just earned the "..(c.addons.name)..".")
                else
                    doPlayerSendCancel(cid, "You need item.")
                    break
                end
            end
        else
            doPlayerSendCancel(cid, "You need level "..(c.level)..".")
        end
    else
        doPlayerSendCancel(cid, "You have already completed this addon.")
    end
    return true
end
Editado por Caronte
Link para o comentário
Compartilhar em outros sites

  • 0

 

 

acho que deu treta, nao aceita nenhum dos corpos, configurei pra 3065, e 3058 botei as coordenadas e n rolou :c sera que errei em algo?

 

Nem dá erro?

Link para o comentário
Compartilhar em outros sites

  • 0

Bom eu tava meio atrapalhado, era muita posição, esquema com addon etc etc etc dei uma arrumada basica, coloquei pra se rteleportado enfim.

Unica coisa que preciso, que aceite o id 3058, e o id 3065.
no "checkplace". RESUMINDO: se colocar apenas o 3058 no checkplace vai rodar o script, ou se quiser colocar apenas o 3065 vai rodar o script também.

local c = {
	checkItems = {[3058] = 1}, -- [itemId] = quantidade
	checkPlaces = {{x=934, y=711, z=7}}, -- posicao
	storage = 2306,
	level = 50
}

local function getTableMax(t)
	local ret = 0
	for _, i in pairs(t) do
		ret = ret + 1
	end
	return ret
end

function onUse(cid, item, fromPosition, itemEx, toPosition)
	local teleport = {x=948, y=716, z=7} -- Coordenadas para onde o player irá ser teleportado.
	if(getPlayerStorageValue(cid, c.storage) == -1) then
		if(getPlayerLevel(cid) > c.level) then
			local done = {}
			for n, pos in pairs(c.checkPlaces) do
				for itemId, count in pairs(c.checkItems) do
					local posItem = getTileItemById(pos, itemId)
					if(posItem.uid ~= 0 and (count == 1 or posItem.type >= count) and not done[itemId]) then
						done[itemId] = {count, pos}
						break
					end
				end
			end
			if(getTableMax(done) == getTableMax(c.checkItems)) then
				for i, t in pairs(done) do
					doRemoveItem(getTileItemById(t[2], i).uid, t[1])
					doSendMagicEffect(t[2], CONST_ME_POFF)
				end
				setPlayerStorageValue(cid, c.storage, 1)
				doTeleportThing(cid, teleport)
				doSendMagicEffect(getPlayerPosition(cid), 10)
				doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce sacrificou o corpo de um belo jovem, uma pena... mas foi preciso.")
			else
				doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce precisa colocar corpo de alguem na chama roxa do inferno.")
			end
		else
			doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce precisa de level "..(c.level)..".")
		end
	else
		doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce ja fez este sacrificio.")
	end
	return true
end
Editado por 4sharedddd
Link para o comentário
Compartilhar em outros sites

  • 0

Eu fiz aqui, baseado nas coisas que você quer:

local c = { checkItems = {	[3058] = 1, 
							[3065] = 100,
			},
			checkPlace = {x= 934, y = 711, z = 7},
			storage = 2306,
			level = 50,
			teleport = {x = 948, y = 716, z = 7},
	}
			
function onUse(cid)

	if getPlayerStorageValue(cid, c.storage) == -1 then
		if getPlayerLevel(cid) >= c.level then
			for id, count  in pairs(c.checkItems) do
				if getTileItemById(c.checkPlace, id).count >= count then
					doRemoveItem(getTileItemById(c.checkPlace, id).uid, count)
					doSendMagicEffect(c.checkPlace, CONST_ME_POFF)
					doPlayerSetStorageValue(cid, c.storage, 1)
					doTeleportThing(cid, c.teleport)
					doSendMagicEffect(getThingPos(cid), 10)
					doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce sacrificou o corpo de um belo jovem, uma pena... mas for preciso.")
				else
						PlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce precisa colocar corpo de alguem na chama roxa do inferno.")
				end
			end
		else
			doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce precisa de level "..(c.level)..".")
		end
	else
		doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Voce ja fez este sacrificio.")
	end
	return true
end

Só agora que vi isso: "Voce sacrificou o corpo de um belo jovem, uma pena... mas foi preciso."

kkkkkkkkkk

Link para o comentário
Compartilhar em outros sites

  • 0

 

 

Se não se importa, aqui está a correção que escrevi:

 

Claro que não s2

eu esqueci que é type kkkk...

 

Eu não uso a variável porque uma vez quando usei, deu uns erros e tentei ver porque, e não entendi.

talvez eu coloquei onde não poderia fazer isso num addEvent ou sei lá...

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...