Legal o desafio e a iniciativa para entender a linguagem lua, laços de repetição. Legal lobo ![]()
Boa sorte aos participantes ![]()
- Fórum
- OTServ
- Discussion
- Exposições (Show Off)
- Desafio do mês. #02
Desafio do mês. #02
Por Night Wolf, 05 de nov. de 2015 em Exposições (Show Off)
info
Grupo: Campones
Registrado: 11/07/13
Posts: 30
Reputação: +1

info
Grupo: Cavaleiro
Registrado: 05/01/08
Posts: 153
Reputação: +93
Char no Tibia: nenhum

Tudo bem, nunca tinha participado deste desafio antes... vamos lá... antes de tudo, quero dizer que ao falar var config.rX eu me refiro ao índice rX da table config, usei var config.rX para evitar ficar muito grande, o mesmo vale para os variantes disto.
Esta function countdown(pos) realiza uma contagem regressiva do que o scripter definir na variável tempo até 0 (na tela in game, enquanto no script ele aumenta a var j até chegar no valor tempo) e quando chega a 0 e, ao mesmo tempo, se a posição pos[lugares] estiver disponível, então ele cria o "monstro" (que deve ser colocado o nome no lugar de"Nome monstro") em todas posições da tabela indicada como parâmetro para a função. Lembrando que a contagem in game é feita na mesma pos onde o monstro será criado.
function countdown(pos) -- apenas a ideia, pode ser que isso nao seja a prova de bugs e tenha que ser feito uma versao recursiva. for lugares = 1, #pos do for j = 0, tempo do addEvent(sendTextMessage, 1000 * j, tempo - j, pos[lugares]) if j == tempo and not check_disponivel(pos) then createMonster(pos[lugares], "Nome monstro") end end end end
Essa function check_disponivel(pos) não entendi direito, creio que seja para checar se a posição está disponível para teleportar o player.
function countdown(pos) -- apenas a ideia, pode ser que isso nao seja a prova de bugs e tenha que ser feito uma versao recursiva. for lugares = 1, #pos do for j = 0, tempo do addEvent(sendTextMessage, 1000 * j, tempo - j, pos[lugares]) if j == tempo and not check_disponivel(pos) then createMonster(pos[lugares], "Nome monstro") end end end end
A function onStepIn(cid) apenas chama a function fazQualquerCoisa(cid) quando alguém sobe em cima do tile, mandando o uid do player como parâmetro.
function onStepIn(cid) fazQualquerCoisa(cid) return true end
Agora vamos a function fazQualquerCoisa(cid, i, j), esta função explicarei por partes... vamos lá...
j = j or 0 p = i or 0
Se a var j existir, ela recebe o próprio valor ou, caso contrário, ela receberá o valor de 0. Já no caso da var p, se a var i existir, ela recebe o valor de i ou, caso contrário, ela receberá o valor de 0.
if p > config.rX then p = 0 j = j < config.rY -1 and j + 1 or false end
Se a var p for maior do que a var config.rX (acredito que seja o raio em x) então a var p vai receber 0. Depois se a var j for menor ou igual a var config.rY - 1 (acredito que seja o raio em y reduzido em 1), a var j recebe o próprio valor acrescentado de 1, caso contrário recebe o valor booleano false.
if j then
posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z}
if check_disponivel(posi) then
doTeleportThing(cid, posi)
countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} )
else
fazQualquerCoisa(p + 1, j)
end
end
Se j existir e não for false (caso não tenha entendido como ele possa ter o valor false, ver explicação anterior), então a var posi vai receber a seguinte posição: coordenada x vai receber a variável pos.x somado da var p vezes a var config.distX (lembrando que irá multiplicar para depois somar). Com a coordenada y vai acontecer a mesma coisa, porém será a var j multiplicado pela config.distY ao invés da var p multiplicada pela var config.distX. A coordenada z vai receber a coordenada z da var pos.
Se estiver disponível a pos da var posi (explicado anteriormente na function check_disponivel(posi)) então irá teleportar o player para a posi e executar o countdown (explicado anteriormente). Em countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} ) ele manda para a function countdown as posições superior direita e superior esquerda, respectivamente, de onde o player será teleportado., caso contrário, irá repetir a function fazQualquerCoisa. Nesta parte de repetir a function fazQualquerCoisa eu não entendi, pois ele manda a var p+1 aonde ele recebe o parâmetro cid e o j aonde recebe o parâmetro i, creio que o correto seria fazQualquerCoisa(cid, p + 1, j), mas enfim, o código destrinchado é este, agora vou falar para o que imagino que seja.
Function fazQualquerCoisa(cid, i, j) completa abaixo:
function fazQualquerCoisa(cid, i, j) -- recursao caudal
j = j or 0
p = i or 0
if p > config.rX then
p = 0
j = j < config.rY -1 and j + 1 or false
end
if j then
posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z}
if check_disponivel(posi) then
doTeleportThing(cid, posi)
countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} )
else
fazQualquerCoisa(p + 1, j)
end
end
end
Para o que acho que foi feito este script irei postar em breve, tenho que almoçar primeiro asuhashuasuh.
Vamo lá vou chutar não manjo nada de script mais vo tentar, isso faz quando vc pisar em algum tile ele veja se o lugar configurado esteja vazio se sim teleporta o player até lá e sumona algum monstro acho q é isso
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

creio que o correto seria fazQualquerCoisa(cid, p + 1, j)
você tem razão, é que eu fiz o código correndo porque tinha esquecido disso daqui e acabei esquecendo de passar esse parâmetro. Vou editar, vlw
info
Grupo: Cavaleiro
Registrado: 05/01/08
Posts: 153
Reputação: +93
Char no Tibia: nenhum

Vamos la, pelo que vi ele roda toda uma area a partir da var pos variando distX em X e distY em y, dentro de um range rX para x e rY para y, a primeura dessas pos onde estiver disponivel para teleportar o player ele teleportará e criará os monstros após a contagem regressiva. Minha opinião é qie este é um script para sala de trainers.
Estou no celular pq por algum motivo este tópico não abre no meu pc, se tiver algum erro de digitação releve. E ae, acertei?
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

@@Antharaz, acertou parcialmente.. ele não roda uma área haha ficaria muito custoso
info
Grupo: Cavaleiro
Registrado: 05/01/08
Posts: 153
Reputação: +93
Char no Tibia: nenhum

Oxi roda sim, soh q variando a pos em distX e distY ate achaf uma pos valida .-.
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

se vc fizer 1 desenho exemplificando como ele busca a área e me falar oque essa área representa eu digo que vc venceu, justo?
info
Grupo: Cavaleiro
Registrado: 05/01/08
Posts: 153
Reputação: +93
Char no Tibia: nenhum

Ok, mas terei de fazer pelo celular pq no pc n abre este topico n sei pq.
local config = {
distX=3;
distY=3;
rY=15;
rY=15
}
local pos = {x=147,y=300,z=7}
Assim ele rodará uma área de 15 em x e y saindo a partir da pos inicial variando de x em 3 e y em 3. As posiçoes verificadas serao:
{x=147,y=300,z=7}
{x=147,y=300,z=7}
{x=147,y=300,z=7}
Apertei o responder do celular sem qrer, estou terminando de ppstar as pos
Falei errado e.e o rx e o ry eh o numero de repetiçoes em x e y para achar a pos, eu li o codigo errado antes hahahah e.e tnc
Seguindo este exemplo acima as pos serao:
{x =147, y = 300, z = 7}
{x =150, y = 300, z = 7}
{x =153, y = 300, z = 7}
{x =156, y = 300, z = 7}
{x =159, y = 300, z = 7}
{x =162, y = 300, z = 7}
{x =165, y = 300, z = 7}
{x =168, y = 300, z = 7}
{x =171, y = 300, z = 7}
{x =174, y = 300, z = 7}
{x =177, y = 300, z = 7}
{x =180, y = 300, z = 7}
{x =183, y = 300, z = 7}
{x =186, y = 300, z = 7}
{x =189, y = 300, z = 7}
{x =192, y = 300, z = 7}
{x =147, y = 303, z = 7}
{x =150, y = 303, z = 7}
{x =153, y = 303, z = 7}
{x =156, y = 303, z = 7}
{x =159, y = 303, z = 7}
{x =162, y = 303, z = 7}
{x =165, y = 303, z = 7}
{x =168, y = 303, z = 7}
{x =171, y = 303, z = 7}
{x =174, y = 303, z = 7}
{x =177, y = 303, z = 7}
{x =180, y = 303, z = 7}
{x =183, y = 303, z = 7}
{x =186, y = 303, z = 7}
{x =189, y = 303, z = 7}
{x =192, y = 303, z = 7}
{x =147, y = 306, z = 7}
{x =150, y = 306, z = 7}
{x =153, y = 306, z = 7}
{x =156, y = 306, z = 7}
{x =159, y = 306, z = 7}
{x =162, y = 306, z = 7}
{x =165, y = 306, z = 7}
{x =168, y = 306, z = 7}
{x =171, y = 306, z = 7}
{x =174, y = 306, z = 7}
{x =177, y = 306, z = 7}
{x =180, y = 306, z = 7}
{x =183, y = 306, z = 7}
{x =186, y = 306, z = 7}
{x =189, y = 306, z = 7}
{x =192, y = 306, z = 7}
{x =147, y = 309, z = 7}
{x =150, y = 309, z = 7}
{x =153, y = 309, z = 7}
{x =156, y = 309, z = 7}
{x =159, y = 309, z = 7}
{x =162, y = 309, z = 7}
{x =165, y = 309, z = 7}
{x =168, y = 309, z = 7}
{x =171, y = 309, z = 7}
{x =174, y = 309, z = 7}
{x =177, y = 309, z = 7}
{x =180, y = 309, z = 7}
{x =183, y = 309, z = 7}
{x =186, y = 309, z = 7}
{x =189, y = 309, z = 7}
{x =192, y = 309, z = 7}
{x =147, y = 312, z = 7}
{x =150, y = 312, z = 7}
{x =153, y = 312, z = 7}
{x =156, y = 312, z = 7}
{x =159, y = 312, z = 7}
{x =162, y = 312, z = 7}
{x =165, y = 312, z = 7}
{x =168, y = 312, z = 7}
{x =171, y = 312, z = 7}
{x =174, y = 312, z = 7}
{x =177, y = 312, z = 7}
{x =180, y = 312, z = 7}
{x =183, y = 312, z = 7}
{x =186, y = 312, z = 7}
{x =189, y = 312, z = 7}
{x =192, y = 312, z = 7}
{x =147, y = 315, z = 7}
{x =150, y = 315, z = 7}
{x =153, y = 315, z = 7}
{x =156, y = 315, z = 7}
{x =159, y = 315, z = 7}
{x =162, y = 315, z = 7}
{x =165, y = 315, z = 7}
{x =168, y = 315, z = 7}
{x =171, y = 315, z = 7}
{x =174, y = 315, z = 7}
{x =177, y = 315, z = 7}
{x =180, y = 315, z = 7}
{x =183, y = 315, z = 7}
{x =186, y = 315, z = 7}
{x =189, y = 315, z = 7}
{x =192, y = 315, z = 7}
{x =147, y = 318, z = 7}
{x =150, y = 318, z = 7}
{x =153, y = 318, z = 7}
{x =156, y = 318, z = 7}
{x =159, y = 318, z = 7}
{x =162, y = 318, z = 7}
{x =165, y = 318, z = 7}
{x =168, y = 318, z = 7}
{x =171, y = 318, z = 7}
{x =174, y = 318, z = 7}
{x =177, y = 318, z = 7}
{x =180, y = 318, z = 7}
{x =183, y = 318, z = 7}
{x =186, y = 318, z = 7}
{x =189, y = 318, z = 7}
{x =192, y = 318, z = 7}
{x =147, y = 321, z = 7}
{x =150, y = 321, z = 7}
{x =153, y = 321, z = 7}
{x =156, y = 321, z = 7}
{x =159, y = 321, z = 7}
{x =162, y = 321, z = 7}
{x =165, y = 321, z = 7}
{x =168, y = 321, z = 7}
{x =171, y = 321, z = 7}
{x =174, y = 321, z = 7}
{x =177, y = 321, z = 7}
{x =180, y = 321, z = 7}
{x =183, y = 321, z = 7}
{x =186, y = 321, z = 7}
{x =189, y = 321, z = 7}
{x =192, y = 321, z = 7}
{x =147, y = 324, z = 7}
{x =150, y = 324, z = 7}
{x =153, y = 324, z = 7}
{x =156, y = 324, z = 7}
{x =159, y = 324, z = 7}
{x =162, y = 324, z = 7}
{x =165, y = 324, z = 7}
{x =168, y = 324, z = 7}
{x =171, y = 324, z = 7}
{x =174, y = 324, z = 7}
{x =177, y = 324, z = 7}
{x =180, y = 324, z = 7}
{x =183, y = 324, z = 7}
{x =186, y = 324, z = 7}
{x =189, y = 324, z = 7}
{x =192, y = 324, z = 7}
{x =147, y = 327, z = 7}
{x =150, y = 327, z = 7}
{x =153, y = 327, z = 7}
{x =156, y = 327, z = 7}
{x =159, y = 327, z = 7}
{x =162, y = 327, z = 7}
{x =165, y = 327, z = 7}
{x =168, y = 327, z = 7}
{x =171, y = 327, z = 7}
{x =174, y = 327, z = 7}
{x =177, y = 327, z = 7}
{x =180, y = 327, z = 7}
{x =183, y = 327, z = 7}
{x =186, y = 327, z = 7}
{x =189, y = 327, z = 7}
{x =192, y = 327, z = 7}
{x =147, y = 330, z = 7}
{x =150, y = 330, z = 7}
{x =153, y = 330, z = 7}
{x =156, y = 330, z = 7}
{x =159, y = 330, z = 7}
{x =162, y = 330, z = 7}
{x =165, y = 330, z = 7}
{x =168, y = 330, z = 7}
{x =171, y = 330, z = 7}
{x =174, y = 330, z = 7}
{x =177, y = 330, z = 7}
{x =180, y = 330, z = 7}
{x =183, y = 330, z = 7}
{x =186, y = 330, z = 7}
{x =189, y = 330, z = 7}
{x =192, y = 330, z = 7}
{x =147, y = 333, z = 7}
{x =150, y = 333, z = 7}
{x =153, y = 333, z = 7}
{x =156, y = 333, z = 7}
{x =159, y = 333, z = 7}
{x =162, y = 333, z = 7}
{x =165, y = 333, z = 7}
{x =168, y = 333, z = 7}
{x =171, y = 333, z = 7}
{x =174, y = 333, z = 7}
{x =177, y = 333, z = 7}
{x =180, y = 333, z = 7}
{x =183, y = 333, z = 7}
{x =186, y = 333, z = 7}
{x =189, y = 333, z = 7}
{x =192, y = 333, z = 7}
{x =147, y = 336, z = 7}
{x =150, y = 336, z = 7}
{x =153, y = 336, z = 7}
{x =156, y = 336, z = 7}
{x =159, y = 336, z = 7}
{x =162, y = 336, z = 7}
{x =165, y = 336, z = 7}
{x =168, y = 336, z = 7}
{x =171, y = 336, z = 7}
{x =174, y = 336, z = 7}
{x =177, y = 336, z = 7}
{x =180, y = 336, z = 7}
{x =183, y = 336, z = 7}
{x =186, y = 336, z = 7}
{x =189, y = 336, z = 7}
{x =192, y = 336, z = 7}
{x =147, y = 339, z = 7}
{x =150, y = 339, z = 7}
{x =153, y = 339, z = 7}
{x =156, y = 339, z = 7}
{x =159, y = 339, z = 7}
{x =162, y = 339, z = 7}
{x =165, y = 339, z = 7}
{x =168, y = 339, z = 7}
{x =171, y = 339, z = 7}
{x =174, y = 339, z = 7}
{x =177, y = 339, z = 7}
{x =180, y = 339, z = 7}
{x =183, y = 339, z = 7}
{x =186, y = 339, z = 7}
{x =189, y = 339, z = 7}
{x =192, y = 339, z = 7}
{x =147, y = 342, z = 7}
{x =150, y = 342, z = 7}
{x =153, y = 342, z = 7}
{x =156, y = 342, z = 7}
{x =159, y = 342, z = 7}
{x =162, y = 342, z = 7}
{x =165, y = 342, z = 7}
{x =168, y = 342, z = 7}
{x =171, y = 342, z = 7}
{x =174, y = 342, z = 7}
{x =177, y = 342, z = 7}
{x =180, y = 342, z = 7}
{x =183, y = 342, z = 7}
{x =186, y = 342, z = 7}
{x =189, y = 342, z = 7}
{x =192, y = 342, z = 7}
Na proxima vez irei ler sem pressa kkk
info
Grupo: Campones
Registrado: 18/10/15
Posts: 23
Reputação: +2

bom chutando axo que isso e para criar um tp para augo por 5minutos shuhsu
info
Grupo: Conde
Registrado: 14/02/13
Posts: 702
Reputação: +196
Gênero: Masculino

Pelo que entendi é um script que adiciona o player em uma posição + monstros baseada na quantidade de "salas" disponíveis,
Ou seja, seria como um teleportador de players para trainers, ele vai pegar a quantidade total de salas disponíveis, e vai tentar 1 a 1 usando os cálculos do código, vai contar o tempo configurado no sistema, e depois vai adicionar os monstros.
- Posição da primeira sala
local position = {x = 160, y = 154, z = 7} -- posição do que?
- Começa a verificar cada sala a partir da quantidade de vezes que executou a recursividade, caso encontre uma sala disponível, teleporta o player para ela, e inicia a contagem de tempo e criar os monstros
function fazQualquerCoisa(cid, pos, i, j) -- recursao caudal
j = j or 0
p = i or 0
if p >= config.rX then
p = 0
j = j < config.rY -1 and j + 1 or false
end
if j then
posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z}
if check_disponivel(posi) then
doTeleportThing(cid, posi)
countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} )
else
fazQualquerCoisa(cid, pos, p + 1, j)
end
end
end
Verifica a disponibilidade da sala em questão, para saber se já esta ocupada ou não.
function check_disponivel(npos)
if disponivel(npos) then
return true
end
return false
end
Começa a contagem regressiva de ( 5 até 0 ), quando chegar no numero ( 0 Visual no jogo, e 5 no código ), ele cria o monstro verificando se a sala esta ocupada ( para saber se o player ainda esta nela provavelmente )
Editado Novembro 5 por BananaFight
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

@BananaFight e @Antharaz acertaram, vcs foram bem ligeirinhos.. pensei que o povo ia demorar alguns dias pra acertar esse :~ preciso começar a pensar em scripts mais dificeis haha.
info
Grupo: Conde
Registrado: 14/02/13
Posts: 702
Reputação: +196
Gênero: Masculino

Você poderia por scripts sem erros, consigo apontar no minimo 5 erros que causariam bugs críticos para esse seu sistema, sem contar que existem jeitos melhores de se aumentarem a performasse do sistema.
Por exemplo:
O que esse sistema faz ?
tabela = {}
local num = 0
for x = 1, 5 do
for y = 1, 5 do
num = num + 1
if (num % 2) ~= 0 then
table.insert(tabela, num)
end
end
end
Editado Novembro 6 por BananaFight
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

roda 25 vezes num = num +1 e checa se ele não é divisivel por 2 pra inserí-lo numa tabela.. e isso é só um jeito q eu pensei de fazer esse código, se eu levei mais de 2 minutos escrevendo isso foi muito. Depois qnd eu for passar pra código mesmo eu optimizo ![]()





info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf
Olá pessoal, seguindo a onda do desafio do mês eu bolei um novo desafio pra vocês no mesmo esquema do anterior (você pode verificar o desafio do mês passado clicando aqui)
Eu vou mais uma vez apresentar um pseudocódigo, algumas partes dele estão mais explícitas na linguagem e outras estão mais teóricas mas isso não vai influenciar tanto.
local position = {x = 160, y = 154, z = 7} -- posição do que? function fazQualquerCoisa(cid, pos, i, j) -- recursao caudal j = j or 0 p = i or 0 if p >= config.rX then p = 0 j = j < config.rY -1 and j + 1 or false end if j then posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z} if check_disponivel(posi) then doTeleportThing(cid, posi) countdown({{x = posi.x + 1, y = posi.y - 1, z = posi.z}, {x = posi.x - 1 , y = posi.y - 1, z = posi.z}} ) else fazQualquerCoisa(cid, pos, p + 1, j) end end end function check_disponivel(npos) if disponivel(npos) then return true end return false end function countdown(pos, Arraypos) -- apenas a ideia, pode ser que isso nao seja a prova de bugs e tenha que ser feito uma versao recursiva. local tempo = 5 -- tempo de que? for lugares = 1, #Arraypos do for j = 0, tempo do addEvent(function() sendTextMessage(Arraypos[lugares], tempo - j, TEXTCOLOR_ORANGE) if j == tempo and not check_disponivel(pos) then createMonster(Arraypos[lugares], "Nome monstro") end end, 1000 * j) end end end function onStepIn(cid) fazQualquerCoisa(cid, position) return true endO desafio é o seguinte: vocês tem que tentar adivinhar do que se trata esse código. Isso vale tanto para explicar partes do código quanto para explicar a idéia por trás dele.
A cada dia (o primeiro não conta) irei postar uma dica para ajudá-los nesse desafio, podendo ser uma dica explicando partes do código ou dicas sobre a funcionalidade dele.
"Mas lobo, por que eu iria tentar descobrir do que se trata seu código estúpido?" Bem meu caro, será uma tarefa legal e esse script é uma idéia bem inovadora.. só o fato de você tentar ler irá ajudá-lo a treinar seu cérebro para a linguagem Lua. E também há uma recompensa!! aquele que acertar ou chegar mais perto verá e terá acesso ao código antes de todo mundo!!111
Espero que vocês aninem pra participar deste tanto quanto animaram para participar do outro
Dicas = { }Lembrando que toda resposta próxima da correta irá ganhar 1 ponto de reputação.
Editado Novembro 5 por Night Wolf