Ir para conteúdo
  • Cadastre-se

Sitema%2FMod CMS #01 - Element Puzzle Quest


Posts Recomendados

  • 2 weeks later...

Criatividade e Inovação: 18/25  -- 5,5/12,5 de código e 12,5/12,5 de execução
Aplicabilidade: 13/15
Simplicidade e Organização: 5/10
Nota final: 7,2

Comentário final: Seu script rodando é lindo, mas o código está repetitivo e podia ser simplificado. Você também identou de maneira errada e fez o script tomar um formato piramidal, o correto é só usar separação pra indicar blocos de código.


ex: 
function pairsByKeys(t, f) -- Lua.org
    local a = {}
    for n in pairs(t) do
		table.insert(a, n)
	end
	
    table.sort(a, f)
    local i = 0      -- iterator variable
	
	local iter = function ()   -- iterator function
		i = i + 1
			if a[i] == nil then
				return nil
			else 
				return a[i], t[a[i]]
			end
    end
return iter
end

isso é uma identação correta, o if está na mesma linha do seu else e seu end.

 


Oque te salvou foi que sua idéia foi genial, sério, jamais pensaria numa coisa assim. É simples, é bom. Sua idéia foi um exemplo de "Menos é mais" e foi um dos poucos scripts que eu vi em que realmente precisava achar a lógica pra ganhar o prêmio.

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

Bom, como eu já havia dito: Ainda bem que no concurso, vale mais a criatividade do que o Script em si.

Ainda estou estudando tables e algumas coisinhas amais em LUA.

 

Certamente no próximo concurso estarei melhor.

Obrigado!

cms1-pr%C3%AAmio.png

Link para o post
Compartilhar em outros sites

Obrigado por participar do concurso, espero que também participe dos próximos.

O tópico foi movido para a área correta.

Bruno de Carvalho Câmara / Administrador TibiaKing

[email protected]


 

btn_donateCC_LG.gif

 

Em 26/12/2016 em 03:47, Spraypaint disse:

A força da alienação vem dessa fragilidade dos indivíduos, quando apenas conseguem identificar o que os separa e não o que os une.

-miltinho

 

wMwSJFE.png?1

 

Link para o post
Compartilhar em outros sites

Cara, script muito bom. Principalmente para que tem criatividade para Quest, ou seja eu rsrsrs. Parabéns. :D

Eu te Ajudei? Então solta aquele REP+ !!

Meus Tutoriais [Tutorial] Bug "Temple position is wrong" (MySql)

Outros:    [Meu Show OFF | Mapa próprio 8.6] 

Link para o post
Compartilhar em outros sites

só uma dica, podia incrementar pro player ter que pagar algum tributo cada vez que ele clica pra ver quais são os pares.. podia ser perder 10% da vida

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites
só uma dica, podia incrementar pro player ter que pagar algum tributo cada vez que ele clica pra ver quais são os pares.. podia ser perder 10% da vida

 

É uma boa sugestão!

Essa é uma pequena puzzle que adicionei em uma espécie de Quest chamadas "Dangerous" que estou criando para meu futuro OTServ, onde envolve um tempo limite para ser realizada. A ideia é apenas prender o jogador por um tempo razoável, mas sem fazer ele parar totalmente - pois tem tempo.

 

Por este motivo, fiz com que a utilização da Element Puzzle fosse liberada para qualquer um que esta dentro da DG sem a necessidade de pagar coisa alguma ou se preocupar com HP ou com potions. Apenas parar e analisar! - Se tiver em grupo, um amigo ativa as dicas dos elementos enquanto outro gira as estátuas. Ficando assim:

 

  • Resolva a puzzle e passa pelo portal que te levará para a continuação da Quest.
  • Se morrer lá na frente, retorna ao início e tem que passar pelo puzzle novamente.

 

Mas em todo caso, gostei da sua ideia. Eu realmente estou estudando .lua para poder reformular esse Script - porque é óbvio que ele precisa de modificações. Quando eu souber o que fazer, adicionarei as devidas correções junto com sua sugestão.

 

OBS: Sabe do que eu senti falta na sua avaliação #White? Dicas de estudo!

Assim, logo após perceber algo que não devia no script, você poderia dizer: "Você errou aqui e minha sugestão é que estude isso e isso pra melhorar". Talvez postando link para algum tutorial ou algo do tipo. Eu não ficaria constrangido com você me mandando estudar, sério :D .

 

Você entende melhor disso do que nós, meros mortais, e qualquer dica que vim de sua parte é uma grande contribuição.

 

No mais... Obrigado!

Editado por Frenesy (veja o histórico de edições)

cms1-pr%C3%AAmio.png

Link para o post
Compartilhar em outros sites

uhauheuhauh que isso cara, tem muita coisa que eu só sei na teoria.. o próprio script do kilua tá mais bonito e organizado que muito script meu :~ lembrem-se que eu sou estudante assim como vocês. Em todo caso você pode pensar numa forma de executar as funções por um for, já ia diminuir bastante linhas no seu código. Você tem que pensar tb que tudo no seu código é alterável e vc pode fazer alterações de forma a seguir sequência.

ex:

if item.itemid == 3705 then
doTransformItem(item.uid, 3706)

elseif item.itemid == 3706 then
doTransformItem(item.uid, 3707)

elseif item.itemid == 3707 then
doTransformItem(item.uid, 3708)

elseif item.itemid == 3708 then
doTransformItem(item.uid, 3705)
end

note a lógica, todos são o numero atual +1 com exceção do 8, logo eu poderia simplificar simplesmente pra 

if item.itemid ~= 3708 then
doTransformItem(item.uid, item.itemid + 1)
else
doTransformItem(item.uid, 3705)
end

fazendo um pouco mais de esforço eu poderia transformar num ternário

local a = item.itemid ~= 3708 and doTransformItem(item.uid, item.itemid + 1) or doTransformItem(item.uid, 3705)

Você ainda poderia fazer um if restritivo pro caso de ser maior e colocar o transform fora da checagem

doTransformItem(item.uid, item.itemid + 1)
if item.itemid > 3708 then
doTransformItem(item.uid, 3705)
end

O segredo de programar é encontrar padrões matemáticos nos scripts.. claro que isso não vem da noite pro dia, vc precisa estudar bastante e ter uma visão bem ampla do mundo.
O script que eu mais abusei de matemática foi esse daqui http://www.tibiaking.com/forum/topic/48627-fogos-de-artificio/

Só lembra que não tem jeito certo e errado, apenas formas diferentes. A nivel de tibia, uma forma que usa mais ou menos memória não vai atrapalhar, é mais pra ter um script bonito esteticamente e de fácil entendimento

edit: vc tb pode remover de dentro do callback tudo que não depende de algum de seus parametros e identar da forma correta.

Não testei pra ver se funciona mas acredito que assim diminua um pouco das linhas e deixe mais bonito de se ver:

local posA = {
    {x = 997, y = 993, z = 7, stackpos= 1}, -- Fogo
    {x = 995, y = 994, z = 7, stackpos= 1}, -- Pedra
    {x = 994, y = 996, z = 7, stackpos= 1}, -- Dark
    {x = 994, y = 998, z = 7, stackpos= 1}, -- Terra
    {x = 995, y = 1000, z = 7, stackpos= 1}, -- Gelo
    {x = 997, y = 1001, z = 7, stackpos= 1}, -- Poison   
    {x = 1001, y = 993, z = 7, stackpos= 1}, -- Gelo
    {x = 1003, y = 994, z = 7, stackpos= 1}, -- Poison
    {x = 1004, y = 996, z = 7, stackpos= 1}, -- Pedra
    {x = 1004, y = 998, z = 7, stackpos= 1}, -- Fogo
    {x = 1003, y = 1000, z = 7, stackpos= 1}, -- Dark
    {x = 1001, y = 1001, z = 7, stackpos= 1}, -- Terra
}
function onUse(cid, item, frompos, item2, topos)

local posC = {
-- Combinação das Estatuas.
-- A Combinação é sempre formada por 2 index. [1 e 2]; [3 e 4]; [5 e 6], etc.
-- Index do 1 ao 6 são as Estátuas do lado Esquerdo (As que não podem girar). Do 7 ao 12 são as do lado Direito (As que podem girar).
-- A combinação deve ser sempre com números 1 ao 6 combinados com números 7 ao 12.
	[1] = getThingfromPos(posA[1]), -- Fogo
	[2] = getThingfromPos(posA[10]), -- Fogo
	[3] = getThingfromPos(posA[2]), -- Pedra
	[4] = getThingfromPos(posA[9]), -- Pedra
	[5] = getThingfromPos(posA[3]), -- Dark
	[6] = getThingfromPos(posA[11]), -- Dark
	[7] = getThingfromPos(posA[4]), -- Terra
	[8] = getThingfromPos(posA[12]), -- Terra
	[9] = getThingfromPos(posA[5]), -- Gelo
	[10] = getThingfromPos(posA[7]), -- Gelo  
	[11] = getThingfromPos(posA[6]), -- Poison
	[12] = getThingfromPos(posA[8]), -- Poison
-- Fogo [1 e 2]: Estatua que está na Posição 1 (Esquerdo), combina com a estátua que está na posição 10 (Direita).
-- Pedra [3 e 4]: Estatua que está na Posição 2 (Esquerdo), combina com a estátua que está na posição 9 (Direita).
-- Dark [5 e 6]: Estatua que está na Posição 3 (Esquerdo), combina com a estátua que está na posição 11 (Direita).
-- ...
}

if getPlayerStorageValue(cid, 10000) == -1 then
-- Combinação das Estátuas. Note que se você alterar a tabela "posC" acima, não precisa alterar nada essa parte do Script. Essa parte NUMCA deve ser alterada.
	if posC[1].itemid == posC[2].itemid and posC[3].itemid == posC[4].itemid and posC[5].itemid == posC[6].itemid and posC[7].itemid == posC[8].itemid and posC[9].itemid == posC[10].itemid and posC[11].itemid == posC[12].itemid then
		doSendMagicEffect(getPlayerPosition(cid), 14)
		setPlayerStorageValue(cid, 10000, 1) -- Se a combinação estiver certa, essa Storage impede que o jogador faça essa Quest novamente.
		setPlayerStorageValue(cid, 10001, 1) -- Ao chamar a próxima função, essa storage permite a animação da sestátuas. Sem ela, não tem animação.
		addEvent(CombCerta, 1000, cid, posA) -- Chama a próxima Função.
		-- Caso a sequência das estátuas esteja errada, mostrar as dicas dos elementos.
		-- Note que se você alterar a combinação na tabela "posC", você deve alterar os efeitos abaixo tambem.
	else
		doSendMagicEffect(getPlayerPosition(cid), 13)
		setPlayerStorageValue(cid, 10000, 1) -- Storage temporário.
		addEvent(doSendMagicEffect, 500, posA[11], 17) -- Dark [Efeito 17 na estátua de posição 11]
		addEvent(doSendMagicEffect, 500, posA[3], 17) -- Dark [Efeito 17 na estátua de posição 3]
		addEvent(doSendMagicEffect, 1500, posA[9], 44) -- Pedra [Efeito 44 na estátua de posição 9]
		addEvent(doSendMagicEffect, 1500, posA[2], 44) -- Pedra [Efeito 44 na estátua de posição 2]
		addEvent(doSendMagicEffect, 2500, posA[8], 46) -- Poison [Efeito 46 na estátua de posição 8]
		addEvent(doSendMagicEffect, 2500, posA[6], 46) -- Poison [Efeito 46 na estátua de posição 6]
		addEvent(doSendMagicEffect, 3500, posA[12], 50) -- Terra [Efeito 50 na estátua de posição 12]
		addEvent(doSendMagicEffect, 3500, posA[4], 50) -- Terra [Efeito 50 na estátua de posição 4]
		addEvent(doSendMagicEffect, 4500, posA[7], 43) -- Gelo [Efeito 43 na estátua de posição 7]
		addEvent(doSendMagicEffect, 4500, posA[5], 43) -- Gelo [Efeito 43 na estátua de posição 5]
		addEvent(doSendMagicEffect, 5500, posA[10], 6) -- Fogo [Efeito 6 na estátua de posição 10]
		addEvent(doSendMagicEffect, 5500, posA[1], 6) -- Fogo [Efeito 6 na estátua de posição 1]
		addEvent(doSendMagicEffect, 6500, getPlayerPosition(cid), 13)
		addEvent(setPlayerStorageValue, 6502, cid, 10000, -1) -- Se você mecher na Storage temporária acima, altere aqui tambem.
	end
else
doSendMagicEffect(getThingPos(cid), 2)
end
return true
end


function CombCerta(cid, posA)
local posC = {
	[1] = getThingfromPos(posA[1]), -- Fogo
	[2] = getThingfromPos(posA[10]), -- Fogo
	[3] = getThingfromPos(posA[2]), -- Pedra
	[4] = getThingfromPos(posA[9]), -- Pedra
	[5] = getThingfromPos(posA[3]), -- Dark
	[6] = getThingfromPos(posA[11]), -- Dark
	[7] = getThingfromPos(posA[4]), -- Terra
	[8] = getThingfromPos(posA[12]), -- Terra
	[9] = getThingfromPos(posA[5]), -- Gelo
	[10] = getThingfromPos(posA[7]), -- Gelo  
	[11] = getThingfromPos(posA[6]), -- Poison
	[12] = getThingfromPos(posA[8]), -- Poison
}

local tp = {
toPos = {x = 998, y = 985, z = 7}, -- Posição da Sala da recompensa.
Pos = {x = 999, y = 994, z = 7},   -- Posição onde será criado o Teleport.
}
-- Se a posição das estatuas estiverem de forma circular, assim como esta demonstrado na imagem e no video deste tópico, não precisa se importar em modificar aqui.


if getPlayerStorageValue(cid, 10001) == 1 then
	doTransformItem(posC[1].uid, 3705)
	doSendMagicEffect(posA[1], 14)
	doTransformItem(posC[10].uid, 3705)
	doSendMagicEffect(posA[7], 14)
	addEvent(CombCerta, 1000, cid, posA)
	setPlayerStorageValue(cid, 10001, 2)	
elseif getPlayerStorageValue(cid, 10001) == 2 then 
	doTransformItem(posC[3].uid, 3705)
	doSendMagicEffect(posA[2], 14)
	doTransformItem(posC[12].uid, 3705)
	doSendMagicEffect(posA[8], 14)
	addEvent(CombCerta, 1000, cid, posA)
	setPlayerStorageValue(cid, 10001, 3)
elseif getPlayerStorageValue(cid, 10001) == 3 then 
	doTransformItem(posC[5].uid, 3706)
    doSendMagicEffect(posA[3], 14)
    doTransformItem(posC[4].uid, 3708)
    doSendMagicEffect(posA[9], 14)
    addEvent(CombCerta, 1000, cid, posA)
	setPlayerStorageValue(cid, 10001, 4)
elseif getPlayerStorageValue(cid, 10001) == 4 then 
	doTransformItem(posC[7].uid, 3706)
    doSendMagicEffect(posA[4], 14)
    doTransformItem(posC[2].uid, 3708)
    doSendMagicEffect(posA[10], 14)
    addEvent(CombCerta, 1000, cid, posA)
	setPlayerStorageValue(cid, 10001, 5)
elseif getPlayerStorageValue(cid, 10001) == 5 then 
	doTransformItem(posC[9].uid, 3707)
    doSendMagicEffect(posA[5], 14)
    doTransformItem(posC[6].uid, 3707)
    doSendMagicEffect(posA[11], 14)
    addEvent(CombCerta, 1000, cid, posA)
	setPlayerStorageValue(cid, 10001, 6)
elseif getPlayerStorageValue(cid, 10001) == 6 then 
doTransformItem(posC[11].uid, 3707)
    doSendMagicEffect(posA[6], 14)
    doTransformItem(posC[8].uid, 3707)
    doSendMagicEffect(posA[12], 14)
    addEvent(CombCerta, 1000, cid, posA)
	setPlayerStorageValue(cid, 10001, 7)
elseif getPlayerStorageValue(cid, 10001) == 7 then
    for _, pos in ipairs(posA) do
		doSendDistanceShoot(pos, tp.Pos, 28)
    end
    doSendMagicEffect(tp.Pos, 10)
    doCreateTeleport(1387, tp.toPos, tp.Pos)
    doCreatureSay(cid, "O teleport irá sumir em 10 segundos.", TALKTYPE_ORANGE_1)
    addEvent(removetp, 10000, cid, posA) -- Aqui você muda o tempo que o Teleport ficará disponível.
end
end


function removetp(cid, posB)
local tp = {x = 999, y = 994, z = 7} -- Posição que o Teleport apareceu, para que ele seja removido. Deve ser o mesmo que o "Pos" da tabela "tp" acima.
local t = getTileItemById(tp, 1387)
    for _, ale in ipairs(PosB) do
		local st = getThingfromPos(ale).uid
		doTransformItem(st, math.random(3705, 3708))
    end
    if t then
		doRemoveItem(t.uid, 1)
		doSendMagicEffect(tp, CONST_ME_POFF)
		setPlayerStorageValue(cid, 10000, -1) -- Caso você não consiga entrar no teleport, poderá tentar novamente.
    end
end

Editado por xWhiteWolf (veja o histórico de edições)

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

Só pra constar, eu tentei adicionar a tabela com as posições das estátuas fora da function, no entanto, sempre que eu ligava o OT, travava e desligava tudo. Por isso deixei dentro da function e me senti obrigado a repetir dentro das outras function que ia fazendo ;D

 

O segredo de programar é encontrar padrões matemáticos nos scripts

Gostei desse conselho. Aplicarei nos meus próximos scripts. 

cms1-pr%C3%AAmio.png

Link para o post
Compartilhar em outros sites

vc só coloca dentro se a tabela depender de alguma coisa do próprio script, do contrário ela será carregada quando o server abrir e vai permanecer fixa até o server fechar.
Quando ela tá dentro do callback ela é carregada toda vez que o callback é executado

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

vc só coloca dentro se a tabela depender de alguma coisa do próprio script, do contrário ela será carregada quando o server abrir e vai permanecer fixa até o server fechar.

 

Eu entendi o que quis dizer. Ficou estranho agora, a tabela que ficaria fora apenas servia pra pega as posições das estátuas. Não entendo porque travava. Acho que deve ser o OTServ que usei. Sei lá.

 

#White, meu querido, obrigado pelas dicas.

Minha criatividade se torna limitada devido ao meu conhecimento em lua. Afinal de contas, eu poderia até pensar em uma quest incrível, mas se eu não conseguir recriar ela em lua, de nada adiantaria.

 

Mostrarei o que aprendi no próximo concurso - se houver.

cms1-pr%C3%AAmio.png

Link para o post
Compartilhar em outros sites

É lindo ver dois mestres trocando conhecimentos, meu cérebro quase fritou com esses comentários kkkk

Testado e aprovado REP+

Ficarei no aguardo para o próximo concurso, para ver se você vai trazer outra dessas ideias geniais,

Link para o post
Compartilhar em outros sites

Fiz uma pequena modificação no Script.

Removi repetições desnecessárias e adicionei uma tabela de configuração no início do Script para facilitar a instalação.

cms1-pr%C3%AAmio.png

Link para o post
Compartilhar em outros sites

Ótimo trabalho, muita criatividade !

Funciona nos TFS 1.0 - 1.1 ?

 

EDIT:

 

Testei no TFS 1.1 e funcionou 90% o único problema é que após concluir, não acontece nada, o teleport não aparece !

Editado por Chriistian (veja o histórico de edições)

WN4m2fS.png

 

 

Link para o post
Compartilhar em outros sites

Ai que está o problema, não reporta erro nenhum.

 

kkk, isso é um problema!

Assim que disse que o script não estava funcionando adequadamente, instalei novamente o script em um servidor 8.60 aqui para verificar.

Tudo rodou perfeitamente, por isso pedi para você ser mais específico relatando algum erro.

 

Mas como não aparece nenhum erro, fico sem saber como ajudar. Por que aqui, funcionou corretamente.

Sugiro que instale novamente o script refazendo com atenção os passos para instalação e configuração.

 

Qualquer coisa, pode postar aqui. Tentarei ajudar!

cms1-pr%C3%AAmio.png

Link para o post
Compartilhar em outros sites
  • 9 months later...

Muito bom!! teria como colocar um limite? por exemplo só pode clicar 6x na estatua central caso clique mais do que isso é levado para o templo.

Scriptszinhos:

 

Não abandone seu tópico, quando você tiver a dúvida resolvida sozinho tente ensinar aos outros como resolve-la (você pode não ser o único com o problema) e quando ela for resolvida por outra pessoa não se esqueça de marcar como melhor resposta e deixar o gostei.

Link para o post
Compartilhar em outros sites
  • 2 weeks later...

Por exemplo, se eu quisesse fazer com que esse script ai, funciona-se como a entrada de uma quest, isso daria certo? Por exemplo, iriam ser muitos players passando em cima do piso para entrar na sala, dai um só mexe nas estatuas, isso daria certo?

[progress=green]50[/progress]

 

Link para o post
Compartilhar em outros sites
  • 1 year later...

Aqui não funciona, não aparece o efeito nas estatuas. Sem erros na distro, o server é 8.6! As posições estão certas sim, importei seu mapa.

Sem título.png

Link para o post
Compartilhar em outros sites

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.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo