Jump to content
Close
thelifeofpbion

Normal [Ajuste] Script DUVIDA

Recommended Posts

Bom, eu tenho esse script que é de um last man standing, porem ele é por interval... modifiquei para onTime para acontecer tal hora...

porém acho que era preciso o onthink pro script ficar verificando quem é a ultima pessoa da sala determinada por {x,y,z}  {x,y,z}, mas eu queria por onTime... porque onthink é muito bbagunçado, depende muito da hora que abre o servidor, acredito eu.

resumindo o problema: como fazer para que o script verifique a quantidade de players da sala a todo momento e mesmo assim poder realizer o onTime para eu determinar o horario do evento?... vale lembrar que existe outro script onde cria teleport e manda para a sala... mas nao tem nada de necessario nele.
 

Spoiler

local t = {
 tmp = {
 {x = 1165, y = 1336, z = 7}, -- esquerda nort sala de espera
 {x = 1177, y = 1348, z = 7} -- sul direita sala de espera
 },
 arena = {
 {x = 1145, y = 1278, z = 7}, -- North west Corner of Arena
 {x = 1197, y = 1330, z = 7}, -- South East corner of Arena
 {x = 1171, y = 1304, z = 7} -- Center of Arena
 },
 
 from = {x = 1145, y = 1278, z = 7}, -- Top left cornor of the playground (random players teleportation)
 to = {x = 1197, y = 1330, z = 7}, -- Bottom right cornor of the playground (random players teleportation)
 
 minPlayers = 2, -- min players required to start the battle
 noPlayers = 1, -- Leave it as it is
 prize = {6527} -- Reward that player recives
 }
 local kick = 0
 
 function onTime()
 local arenaPlayers = {}
 
 for x = t.arena[1].x, t.arena[2].x do
 for y = t.arena[1].y, t.arena[2].y do
 for z = t.arena[1].z, t.arena[2].z do
 local pos = {x = x, y = y, z = z}
 local n = getTileInfo(pos).creatures
 if n ~= 0 then
 pos.stackpos = 1
 local c = getThingfromPos(pos)
 while c.uid ~= 0 do
 if c.itemid == 1 and c.type == 1 then
 table.insert(arenaPlayers, c.uid)
 if #arenaPlayers == n then
break
 end
 end
 pos.stackpos = pos.stackpos + 1
 c = getThingfromPos(pos)
 end
 end
 end
 end
 end
 
 if #arenaPlayers == 1 then
local p = getPlayerMasterPos(arenaPlayers[1])
 doTeleportThing(arenaPlayers[1], p)
 doSendMagicEffect(p, CONST_ME_TELEPORT)
 doPlayerSendTextMessage(arenaPlayers[1], MESSAGE_STATUS_CONSOLE_BLUE, "You have won the event and received your reward.")
 doBroadcastMessage(getCreatureName(arenaPlayers[1]) .." won a Last Man Standing Event.")
 doPlayerAddItem(arenaPlayers[1], t.prize[math.random(#t.prize)], 10)
kick = 0
 elseif #arenaPlayers > 1 then
if kick == 0 then
 kick = os.time()
 else
 if os.time() - kick >= 840 then
 kick = 0
 for i = 1, #arenaPlayers do
doTeleportThing(arenaPlayers, {x=160, y=54, z=7})
 doPlayerSendTextMessage(arenaPlayers, MESSAGE_STATUS_WARNING, "Too even, try harder next time.")
 end
 end
 end
 elseif #arenaPlayers == 0 then
kick = 0
 
 local players = {}
 for x = t.tmp[1].x, t.tmp[2].x do
 for y = t.tmp[1].y, t.tmp[2].y do
 for z = t.tmp[1].z, t.tmp[2].z do
 local c = getTopCreature({x = x, y = y, z = z})
 if c.type == 1 then
 table.insert(players, c.uid)
 end
 end
 end
 end
 
 if #players >= t.minPlayers then
for i = 1, #players do
local p = {x = math.random(t.from.x, t.to.x), y = math.random(t.from.y, t.to.y), z = math.random(t.from.z, t.to.z)}
 doTeleportThing(players, p)
 doSendMagicEffect(p, CONST_ME_TELEPORT)
 doPlayerSendTextMessage(players, MESSAGE_STATUS_WARNING, "The battle begins. Survive for glory!")
 end
else
 for i = 1, #players do
doTeleportThing(players, {x=160, y=54, z=7})
 doPlayerSendTextMessage(players, MESSAGE_STATUS_WARNING, "The event didn't start because there isn't enough players in area!")
 end
 end
 end
 return true
 end

 


Edited by pablobion (see edit history)

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.

Share this post


Link to post
Share on other sites

@pablobion onThink é meio bagunçado ? Cara, era só usar os.date para iniciar o evento nos dias desejado, usava os.date para checkar a hora, e começava todo dia em tal hora, em qualquer hora, duas, três vezes ao dia, configurando corretamente:

Ex: 

local dh = {
["Monday"] = {now = "11:20:00"},

["Wednesday"] = {now = "17:35:00"},

["Saturday"] = {now = "11:52:00"},

["Sunday"] = {now = "11:54:00"}
}

if dh[os.date("%A")] then
if os.date("%X") >= dh[os.date("%A")].now then
 TibiaKingSay("O Evento TibiaKing irá começar!")
  ----- Funçoes                                                                      
 end
end                                                                       

O evento iria iniciar nesses dias nesses horarios. Em fim, se entendi bem, o evento inicia perfeitamente em tal horário, mas não o onThink para realizar os checks corretamente certo ?

 



                                                              ezgif-1-98aab239f3.gif.1a897c9c3225228909e7b356a5cfb8e4.gif

Share this post


Link to post
Share on other sites
2 minutos atrás, KotZletY disse:

@pablobion onThink é meio bagunçado ? Cara, era só usar os.date para iniciar o evento nos dias desejado, usava os.date para checkar a hora, e começava todo dia em tal hora, em qualquer hora, duas, três vezes ao dia, configurando corretamente:

Ex: 


local dh = {
["Monday"] = {now = "11:20:00"},

["Wednesday"] = {now = "17:35:00"},

["Saturday"] = {now = "11:52:00"},

["Sunday"] = {now = "11:54:00"}
}

if dh[os.date("%A")] then
if os.date("%X") >= dh[os.date("%A")].now then
 TibiaKingSay("O Evento TibiaKing irá começar!")
  ----- Funçoes                                                                      
 end
end                                                                       

O evento iria iniciar nesses dias nesses horarios. Em fim, se entendi bem, o evento inicia perfeitamente em tal horário, mas não o onThink para realizar os checks corretamente certo ?

 

 

2 minutos atrás, KotZletY disse:

@pablobion onThink é meio bagunçado ? Cara, era só usar os.date para iniciar o evento nos dias desejado, usava os.date para checkar a hora, e começava todo dia em tal hora, em qualquer hora, duas, três vezes ao dia, configurando corretamente:

Ex: 


local dh = {
["Monday"] = {now = "11:20:00"},

["Wednesday"] = {now = "17:35:00"},

["Saturday"] = {now = "11:52:00"},

["Sunday"] = {now = "11:54:00"}
}

if dh[os.date("%A")] then
if os.date("%X") >= dh[os.date("%A")].now then
 TibiaKingSay("O Evento TibiaKing irá começar!")
  ----- Funçoes                                                                      
 end
end                                                                       

O evento iria iniciar nesses dias nesses horarios. Em fim, se entendi bem, o evento inicia perfeitamente em tal horário, mas não o onThink para realizar os checks corretamente certo ?

 


Sim eu ja uso os.date falei ali no tópico que existe um script que ja inicia o evento.. mas usando date nesse ai so executa uma vez.. e nao fica checando a area para ver quando tem 1 player... mano vc leu o tópico?



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.

Share this post


Link to post
Share on other sites

@pablobion sim li sim, você não compreendeu o que falei, mas esqueça. Esse arquivo que você deseja a modificação, realiza as checkagens, coloque nele um tempo de check, não não irá demorar, e que não irá lagar, de 30s a 1 min, está ótimo, mas minha opinião não vale nada, então releve! hKaokspoaks

 

Spoiler

local t = {
 tmp = {
 {x = 1165, y = 1336, z = 7}, -- esquerda nort sala de espera
 {x = 1177, y = 1348, z = 7} -- sul direita sala de espera
 },
 arena = {
 {x = 1145, y = 1278, z = 7}, -- North west Corner of Arena
 {x = 1197, y = 1330, z = 7}, -- South East corner of Arena
 {x = 1171, y = 1304, z = 7} -- Center of Arena
 },
 
 from = {x = 1145, y = 1278, z = 7}, -- Top left cornor of the playground (random players teleportation)
 to = {x = 1197, y = 1330, z = 7}, -- Bottom right cornor of the playground (random players teleportation)
 
 minPlayers = 2, -- min players required to start the battle
 noPlayers = 1, -- Leave it as it is
 prize = {6527} -- Reward that player recives
 }
 local kick = 0
 
function onThink(interval)
 local arenaPlayers = {}
 
 for x = t.arena[1].x, t.arena[2].x do
 for y = t.arena[1].y, t.arena[2].y do
 for z = t.arena[1].z, t.arena[2].z do
 local pos = {x = x, y = y, z = z}
 local n = getTileInfo(pos).creatures
 if n ~= 0 then
 pos.stackpos = 1
 local c = getThingfromPos(pos)
 while c.uid ~= 0 do
 if c.itemid == 1 and c.type == 1 then
 table.insert(arenaPlayers, c.uid)
 if #arenaPlayers == n then
break
 end
 end
 pos.stackpos = pos.stackpos + 1
 c = getThingfromPos(pos)
 end
 end
 end
 end
 end
 
 if #arenaPlayers == 1 then
local p = getPlayerMasterPos(arenaPlayers[1])
 doTeleportThing(arenaPlayers[1], p)
 doSendMagicEffect(p, CONST_ME_TELEPORT)
 doPlayerSendTextMessage(arenaPlayers[1], MESSAGE_STATUS_CONSOLE_BLUE, "You have won the event and received your reward.")
 doBroadcastMessage(getCreatureName(arenaPlayers[1]) .." won a Last Man Standing Event.")
 doPlayerAddItem(arenaPlayers[1], t.prize[math.random(#t.prize)], 10)
kick = 0
 elseif #arenaPlayers > 1 then
if kick == 0 then
 kick = os.time()
 else
 if os.time() - kick >= 840 then
 kick = 0
 for i = 1, #arenaPlayers do
doTeleportThing(arenaPlayers, {x=160, y=54, z=7})
 doPlayerSendTextMessage(arenaPlayers, MESSAGE_STATUS_WARNING, "Too even, try harder next time.")
 end
 end
 end
 elseif #arenaPlayers == 0 then
kick = 0
 
 local players = {}
 for x = t.tmp[1].x, t.tmp[2].x do
 for y = t.tmp[1].y, t.tmp[2].y do
 for z = t.tmp[1].z, t.tmp[2].z do
 local c = getTopCreature({x = x, y = y, z = z})
 if c.type == 1 then
 table.insert(players, c.uid)
 end
 end
 end
 end
 
 if #players >= t.minPlayers then
for i = 1, #players do
local p = {x = math.random(t.from.x, t.to.x), y = math.random(t.from.y, t.to.y), z = math.random(t.from.z, t.to.z)}
 doTeleportThing(players, p)
 doSendMagicEffect(p, CONST_ME_TELEPORT)
 doPlayerSendTextMessage(players, MESSAGE_STATUS_WARNING, "The battle begins. Survive for glory!")
 end
else
 for i = 1, #players do
doTeleportThing(players, {x=160, y=54, z=7})
 doPlayerSendTextMessage(players, MESSAGE_STATUS_WARNING, "The event didn't start because there isn't enough players in area!")
 end
 end
 end
 return true
 end

 

 

<globalevent name="EventoNãoSeiOque" interval="60000" event="script" value="NomeDesseArquivo.lua"/>

 



                                                              ezgif-1-98aab239f3.gif.1a897c9c3225228909e7b356a5cfb8e4.gif

Share this post


Link to post
Share on other sites
19 minutos atrás, KotZletY disse:

@pablobion sim li sim, você não compreendeu o que falei, mas esqueça. Esse arquivo que você deseja a modificação, realiza as checkagens, coloque nele um tempo de check, não não irá demorar, e que não irá lagar, de 30s a 1 min, está ótimo, mas minha opinião não vale nada, então releve! hKaokspoaks

 

  Ocultar conteúdo


local t = {
 tmp = {
 {x = 1165, y = 1336, z = 7}, -- esquerda nort sala de espera
 {x = 1177, y = 1348, z = 7} -- sul direita sala de espera
 },
 arena = {
 {x = 1145, y = 1278, z = 7}, -- North west Corner of Arena
 {x = 1197, y = 1330, z = 7}, -- South East corner of Arena
 {x = 1171, y = 1304, z = 7} -- Center of Arena
 },
 
 from = {x = 1145, y = 1278, z = 7}, -- Top left cornor of the playground (random players teleportation)
 to = {x = 1197, y = 1330, z = 7}, -- Bottom right cornor of the playground (random players teleportation)
 
 minPlayers = 2, -- min players required to start the battle
 noPlayers = 1, -- Leave it as it is
 prize = {6527} -- Reward that player recives
 }
 local kick = 0
 
function onThink(interval)
 local arenaPlayers = {}
 
 for x = t.arena[1].x, t.arena[2].x do
 for y = t.arena[1].y, t.arena[2].y do
 for z = t.arena[1].z, t.arena[2].z do
 local pos = {x = x, y = y, z = z}
 local n = getTileInfo(pos).creatures
 if n ~= 0 then
 pos.stackpos = 1
 local c = getThingfromPos(pos)
 while c.uid ~= 0 do
 if c.itemid == 1 and c.type == 1 then
 table.insert(arenaPlayers, c.uid)
 if #arenaPlayers == n then
break
 end
 end
 pos.stackpos = pos.stackpos + 1
 c = getThingfromPos(pos)
 end
 end
 end
 end
 end
 
 if #arenaPlayers == 1 then
local p = getPlayerMasterPos(arenaPlayers[1])
 doTeleportThing(arenaPlayers[1], p)
 doSendMagicEffect(p, CONST_ME_TELEPORT)
 doPlayerSendTextMessage(arenaPlayers[1], MESSAGE_STATUS_CONSOLE_BLUE, "You have won the event and received your reward.")
 doBroadcastMessage(getCreatureName(arenaPlayers[1]) .." won a Last Man Standing Event.")
 doPlayerAddItem(arenaPlayers[1], t.prize[math.random(#t.prize)], 10)
kick = 0
 elseif #arenaPlayers > 1 then
if kick == 0 then
 kick = os.time()
 else
 if os.time() - kick >= 840 then
 kick = 0
 for i = 1, #arenaPlayers do
doTeleportThing(arenaPlayers, {x=160, y=54, z=7})
 doPlayerSendTextMessage(arenaPlayers, MESSAGE_STATUS_WARNING, "Too even, try harder next time.")
 end
 end
 end
 elseif #arenaPlayers == 0 then
kick = 0
 
 local players = {}
 for x = t.tmp[1].x, t.tmp[2].x do
 for y = t.tmp[1].y, t.tmp[2].y do
 for z = t.tmp[1].z, t.tmp[2].z do
 local c = getTopCreature({x = x, y = y, z = z})
 if c.type == 1 then
 table.insert(players, c.uid)
 end
 end
 end
 end
 
 if #players >= t.minPlayers then
for i = 1, #players do
local p = {x = math.random(t.from.x, t.to.x), y = math.random(t.from.y, t.to.y), z = math.random(t.from.z, t.to.z)}
 doTeleportThing(players, p)
 doSendMagicEffect(p, CONST_ME_TELEPORT)
 doPlayerSendTextMessage(players, MESSAGE_STATUS_WARNING, "The battle begins. Survive for glory!")
 end
else
 for i = 1, #players do
doTeleportThing(players, {x=160, y=54, z=7})
 doPlayerSendTextMessage(players, MESSAGE_STATUS_WARNING, "The event didn't start because there isn't enough players in area!")
 end
 end
 end
 return true
 end

 

 


<globalevent name="EventoNãoSeiOque" interval="60000" event="script" value="NomeDesseArquivo.lua"/>

 


Fui tomar banho e fiquei pensando sobre... eu me equivoquei naquela mensagem ali e não tive tempo de editar kkkk consegui entender a linha de raciocínio... é que eu pensei que onthink era apenas por milissegundos e não pudesse usar hora e dias como o onTime, foi mal...

mas eu tenho uma duvida... fazendo isso ira fazer com que o globalevent execute a cada 1 min certo?
O teleport do evento fica aberto 5 min então tera 5 eventos? porque o player pode entrar por 5 min e o script executa a cada 1 min...

e também se eu colocar 5 min no interval pode acontecer de o interval acabar 30 segundos depois de abrir o tp do evento e os players que entraram nesses 30 segs vao fazer um evento apenas entre eles..

enfim confuso

vou tentar dar meu jeito... obrigado por me ensinar o time peno onthink :D rep


Edited by pablobion (see edit history)

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.

Share this post


Link to post
Share on other sites

@pablobion você falou algo que está certo, seu pensamento foi de um verdadeiro programador, pensou nos erros que poderiam dar. Mas em fim:

se você tem o onTime() que está iniciando o evento na hora desejada, então blz, você só precisa do onThink que vai checkar a cada 1 min a área para ver se tem só 1x dentre os outros checks.

 

Teve algum problema na distro ? Ou funcionou ?



                                                              ezgif-1-98aab239f3.gif.1a897c9c3225228909e7b356a5cfb8e4.gif

Share this post


Link to post
Share on other sites
16 horas atrás, KotZletY disse:

@pablobion você falou algo que está certo, seu pensamento foi de um verdadeiro programador, pensou nos erros que poderiam dar. Mas em fim:

se você tem o onTime() que está iniciando o evento na hora desejada, então blz, você só precisa do onThink que vai checkar a cada 1 min a área para ver se tem só 1x dentre os outros checks.

 

Teve algum problema na distro ? Ou funcionou ?


Desculpa meu mano, eu tive que vir pra faculdade e não pude testar.. mas logo de noite eu testo e vejo o que consigo fazer... qualquer coisa te mando mention XD mas valeuu


 @KotZletY
EDIT : eu consegui arrumar o que eu queria, continuei usando onTime(porque é a unica forma que sei usar por enquanto ate tirar minhas duvidas de onthink) enfim, para resolver meu problema eu separei o script em dois... um para um determinado horario e a outra parte usei onthink por interval para ficar verificando a area etc... mas se você quiser me ajuda fixando o problema com %X %A do onthink fico agradecido já que entendi a forma porem ta bugado fican spamando a mensagem depois do tempo determinado... não testei o onthink no evento em si mas usei assim... primeiramente pensei q fosse a parte "if os.date("%X") >= dh[os.date("%A")].now then" tentei mudar para == mas não resolveu... alias nem a mensagem aparecia mais.

 

 

 

 

Spoiler

local dh = {
["Monday"] = {now = "11:20:00"},

["Tuesday"] = {now = "07:59:00"},

["Saturday"] = {now = "11:52:00"},

["Sunday"] = {now = "11:54:00"}
}

function onThink(interval)
if dh[os.date("%A")] then
if os.date("%X") >= dh[os.date("%A")].now then
doBroadcastMessage("Reloading addddddddddddddctions")
end
end
return true
end


 



e com o interval de 60000 mas depois do horario determinado ele fica enviando a mensagem a cada um min... 


Edited by pablobion (see edit history)

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.

Share this post


Link to post
Share on other sites

@pablobion você não disse que já estava separado ? haushaus, quando eu disse que tudo em um arquivo só é permitido eu não menti, e nem falei atoa.

 

Você tem o script que inicia o evento e os checks, correto ? 

 

Em um onThink, vai verificar se é tal dia e tal hora, e vai verificar a globalstorage do evento, se for -1 que significa que está sem storage, o evento irá iniciar, setando a globalstorage em 1,  e irá pro próximo check que é a da área e etc..

 

Quando o script fizer o check novamente, a globalstorage do evento estará funcionando, então o script irá pular o check de iniciar o evento, e irá para o próximo, e assim até termina o evento. Quando o evento termina, ele que ele irá checkar tudo de novo, o horário será diferente de quando iniciou o evento, então irá pular, como nos próximos checks da área do evento e etc.. não terá ninguém ele irá pular e assim por diante, a cada 1 min ele irá fazer esse processo, seguindo essa ordem, tranquilamente, sem bugar.

 

 

Em relação ao repetição que você falou, é um jogo de check:

 

if hoje é 21 then

mandamsg("blablabla")

end

 

 

o onThik a cada 1 min irá mandar essa msg, sendo que já mandou certo ?

Como disse é jogo de check, antes de checkar o dia, você checka a globalstorage,

 

if globalStorage == -1 the

if hoje é 21 and hora é 18:30 then

mandamsg("blablabla")

setGlobalStorage(123, 1)

end

end

 

nesse check irá mandar a msg e seta a globalstorage em 1,

 

quando o onThink realizar o check novamente, ele não irá mandar a msg, porque no check ele só manda se a storage for negativa, dizendo que o evento não começou.

 

Então ele irá pular esse check e ir pro próximo. 

 

Quando o evento termina, irá seta a globalstorage em -1 novamente.

 

E quando o onThink for executado ele irá checkar se a globalstorage é -1, porém, terá o check do dia e hora do evento, que não é mais o mesmo, então ele finaliza aquela parte do script ali mesmo.

 

Espero que tenha entendido, não sou bom em explicar algo detalhado.

 

 

Que bom que já resolveu o problema, abraços e boa sorte com seu server! 

 

xD



                                                              ezgif-1-98aab239f3.gif.1a897c9c3225228909e7b356a5cfb8e4.gif

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...