IA

Como Fazer Loop Para Checar Quais Players Têm Storage X.

Por iansinho, 24 de mai. de 2012 em Scripts

otserv
tibia
12
2.8k
iansinhoI
24 de maio de 2012 às 13:17

Olá novamente xtibianos :D

 

Bom, eu queria saber como que faz um loop para fazer uma certa ação com os players que possuem certo storage.

 

Na linguagem .lua eu nunca vi, mas na linguagem pawn é assim que se faz:

for(new i = 0; i < PlayersOnline); ++i )
{
   if (PlayerStorage(i) == 12345)
   {
    FazerAcão(i)
   }
}

 

Obrigado desde já.

VodkartV
24 de maio de 2012 às 13:33

depende do que você quer fazer, você diz em todos os players online?, em certa position? ou checar a storage individualmente de cada player?

caoticC
24 de maio de 2012 às 14:32

Como o vodkart depende de qual maneira vai verificar a storage se e de o player ou se uma verificaçao a todos os players.

Todos os dois sao possiveis de modo que a verificaçao de todos os players se nao estivessem online teria que fazer uma verificaçao na db.

Editado Maio 24 por caotic

iansinhoI
24 de maio de 2012 às 16:04

Entendi a pergunta.

É para fazer o seguinte, por exemplo:

Eu quero que todos os jogadores ONLINE que têm a storage 12345, ganhem 10kk.

Neste exemplo eu poderia colocar esta função no globalevents, para dar 10kk a quem estivesse online e com a storage 12345, a cada 1 hora.

Entenderam?

VodkartV
24 de maio de 2012 às 16:18
function onThink(interval, lastExecution)
local players = {}
local storage,items = 12345, {2160, 100}
for _, pid in pairs (getPlayersOnline()) do
if getPlayerStorageValue(pid, storage) >= 1 then
table.insert(players, pid)
end
end
	if #players > 0 then
for i = 1, #players do
doPlayerAddItem(players[i], items[1], items[2])
end
	end
return TRUE
end

Editado Maio 24 por Vodkart

jhon992J
24 de maio de 2012 às 16:21

A logica é a mesma que na outra linguagem, sóh irá mudar as funções:

local online = getPlayersOnline()											-- retorna todos os players online
for i=1, #online do						    -- abre uma estrutura de repetição que vai de 1 até a última posição do vetor online.
if getPlayerStorageValue(online[i], 12345) > 0 then		   -- verifica se o player da posição i do vetor tem a determinada storage.
	doPlayerAddMoney(online[i], 1000000)						 -- adiciona 10kk ao player da posição i do vetor.
end												    -- finaliza o if
end																						 -- finaliza o for

 

Lista de função que pode te ajudar nos seus códigos: http://www.xtibia.co...sta-de-funcoes/

 

-edit

Tava escrevendo e nem tinha visto que o Vod postou. Agora que ja postei deixa aew, quem sabe ajuda ele a entender melhor. happy.png

Editado Maio 24 por Jhon992

iansinhoI
24 de maio de 2012 às 16:27

Vodkart muito obrigado, mas eu não entendi nada de cada linha que você postou ali... A do Jhon922 está explicada mas está tão diferente da função que você pois.

Obrigado também Jhon922 :D

 

Mas pera ai, eu posso usar tanto a do Jhon922 quanto a do Vodkart?

VodkartV
24 de maio de 2012 às 16:36

bom a diferença do meu é que eu coloquei os jogadores que tem a storage numa tabela, porque imagina se não tiver ninguém online com essa storage?

iria dar erro no distro, enão o meu faz a checagem se tem algum online e executa o script, já o do jhon funciona perfeitamente também, mas tem esse possível bug que eu te disse.

iansinhoI
24 de maio de 2012 às 16:42

Ah entendi. Mas neste caso esse bug não vai ser possível, porque aquilo foi só um exemplo rsrs.

Era pra fazer um sistema que o jogador escolhe se vai entrar no evento... se ele escolher sim (!participar) vai setar a storage nele, ai eu vou criar um comando pra fazer broadcast só pra eles entendeu? Mas as broadcasts são automaticas, e elas só vão ser ativadas quando pelo menos 1 jogador digitar !sim... Entendeu porque esse possível bug não será possível? rsrs.

 

Bom então, duvida resolvida, obrigado aos 2... Como terei que escolher apenas 1 pra dar REP+, eu vou escolher o Vodkart, mas Jhon922, relaxa que eu fico te devendo uma ;)

VodkartV
24 de maio de 2012 às 16:44

Ah entendi. Mas neste caso esse bug não vai ser possível, porque aquilo foi só um exemplo rsrs.

Era pra fazer um sistema que o jogador escolhe se vai entrar no evento... se ele escolher sim (!participar) vai setar a storage nele, ai eu vou criar um comando pra fazer broadcast só pra eles entendeu? Mas as broadcasts são automaticas, e elas só vão ser ativadas quando pelo menos 1 jogador digitar !sim... Entendeu porque esse possível bug não será possível? rsrs.

 

Bom então, duvida resolvida, obrigado aos 2... Como terei que escolher apenas 1 pra dar REP+, eu vou escolher o Vodkart, mas Jhon922, relaxa que eu fico te devendo uma ;)

 

ai já é outro script, é talkactions, globalevents é uma coisa, outra forma de fazer, talkactions é outra.

iansinhoI
24 de maio de 2012 às 16:53

Ah entendi. Mas neste caso esse bug não vai ser possível, porque aquilo foi só um exemplo rsrs.

Era pra fazer um sistema que o jogador escolhe se vai entrar no evento... se ele escolher sim (!participar) vai setar a storage nele, ai eu vou criar um comando pra fazer broadcast só pra eles entendeu? Mas as broadcasts são automaticas, e elas só vão ser ativadas quando pelo menos 1 jogador digitar !sim... Entendeu porque esse possível bug não será possível? rsrs.

 

Bom então, duvida resolvida, obrigado aos 2... Como terei que escolher apenas 1 pra dar REP+, eu vou escolher o Vodkart, mas Jhon922, relaxa que eu fico te devendo uma ;)

 

ai já é outro script, é talkactions, globalevents é uma coisa, outra forma de fazer, talkactions é outra.

Mas pra fazer o loop não é a mesma coisa? Você tá falando que é diferente no sentido de que no globalevents pode ocorrer o bug né?

VodkartV
24 de maio de 2012 às 17:07

o loop é o mesmo sim, estou dizendo que o script para dar uma premio a cada uma hr é uma coisa, e outro de setar a storage pelo talk é outra coisa, envolve mais parâmetros....