Ir para conteúdo
  • Cadastre-se

(Resolvido)Um Script de um evento Diario


Ir para solução Resolvido por zipter98,

Posts Recomendados

Estava Pensando em um "evento"
que assim Acontecia Toda Segunda ,quinta ou Sabado
O evento do sorteio iniciou, diga /sorteio numero(de 1 a 100) para escolher seu numero, em aproximadamente 5 minutos saira o resultado! (Custa 100k para participar)
Agora você está participando do evento, seu número: 6, Aguarde o resultado, Boa sorte!
Parabéns ao Jogador Sei la Nome Vc Acaba De Ganha de 150k aleatoriamente e se os jogadores ambos escolhe os mermo numero dava o valor individo pelo valor dos jogadores
Exemplo E o numero sorteado foi... 6 e os ganhadores foi
Primeiro Lugar Fry Zicah 150k+5 Moeda De Ouro
Segundo Lugar: Fry Zicah 100k+3 Moeda De Ouro
Terceiro Lugar : Fry Zicah 50k 1 Moeda De Ouro

Mais Que n Causes Aflito no script
Lembrando q o segundo e o terceiro lugar vai pra as pessoa q chego mas perto

poderia cria sem os dia de segunda,quinta e sabado so pra testa?

Agradeço rep+

Editado por BruniinszLuana (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

É um script bem complexo..

E outro, sobre classificar os 3 que mais se aproximaram..

Digamos que tenhamos players que escolheu os número 5 e 7.. e o número sorteado for 6.

Como seria classificado?

 

Tens que estudar bem este script para depois por no papel e depois em scripts.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

^uma das formas é essa daqui:
 

TabelaQueDefineORank = {100, 100, 100} -- vai premiar os 3 primeiros e o 100 é o valor minimo que vc tem que estar de distancia pra chegar perto do palpite

for _, escolhidos in ipairs (tb) do -- para todos os numeros escolhidos
	local dist = math.abs(sorteado-escolhidos) -- dist é a distancia entre o numero sorteado e o escolhido pelo player
	for i = 1, #TabelaQueDefineORank do -- roda a tabela comparando se alguem
		if TabelaQueDefineORank[i] > dist then -- se o valor for maior que a distancia
			TabelaQueDefineORank[i] = dist -- substitui o valor com a distancia
		end
	end
end

claro que isso é um pseudocódigo, teria que que fazer ele identificar o uid do player com o palpite e etc;

Outra forma seria fazer ele escolher aleatoriamente entre 7000 + math.random(100) e setar esse global storage como +1 e dai qnd os players se inscrevessem seria escolhendo global storages. Daria pra fazer um repeat until no valor do storage + - um dist e ir incrementando esse dist a cada loop pra procurar os global storages das margens até achar 3 vencedores.

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

Bem interessante, amanhã verei melhor, to no celular agora...

Se quiser sua dúvida tirada, mande PM com os links, e não com a dúvida (outros podem ter a mesma dúvida, e o fórum serve para ser usado).

 

Tópicos:


 

yNlhRVC.png

 

55px-Judo_yellow_belt.svg.png

Link para o post
Compartilhar em outros sites

^uma das formas é essa daqui:

 

TabelaQueDefineORank = {100, 100, 100} -- vai premiar os 3 primeiros e o 100 é o valor minimo que vc tem que estar de distancia pra chegar perto do palpite

for _, escolhidos in ipairs (tb) do -- para todos os numeros escolhidos
	local dist = math.abs(sorteado-escolhidos) -- dist é a distancia entre o numero sorteado e o escolhido pelo player
	for i = 1, #TabelaQueDefineORank do -- roda a tabela comparando se alguem
		if TabelaQueDefineORank[i] > dist then -- se o valor for maior que a distancia
			TabelaQueDefineORank[i] = dist -- substitui o valor com a distancia
		end
	end
end

claro que isso é um pseudocódigo, teria que que fazer ele identificar o uid do player com o palpite e etc;

Outra forma seria fazer ele escolher aleatoriamente entre 7000 + math.random(100) e setar esse global storage como +1 e dai qnd os players se inscrevessem seria escolhendo global storages. Daria pra fazer um repeat until no valor do storage + - um dist e ir incrementando esse dist a cada loop pra procurar os global storages das margens até achar 3 vencedores.

Sim, mas não devemos esquecer de que de qualquer forma, ficará complicado escolher apenas 3 tomando em consideração que podem ter números repetidos e tals, ou um número a mais e a menos, tornando a distância do número sorteado igual. (como no exemplo citado).

 

Enfim, da pra fazer...

Mas tinha algo diferente em mente.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

usa um math.randon(1,2) pra tirar cara ou coroa de empatados... ué...

Se quiser sua dúvida tirada, mande PM com os links, e não com a dúvida (outros podem ter a mesma dúvida, e o fórum serve para ser usado).

 

Tópicos:


 

yNlhRVC.png

 

55px-Judo_yellow_belt.svg.png

Link para o post
Compartilhar em outros sites

Tem que pensar muito bem, porque não poderia excluir outro voto que chegou perto à mesma "distância".

Seria mais interessante, pegar todos que acertaram "em cheio" e dividir o prêmio em questão pela quantidade de players.

Gosta do meu trabalho?

Curta e siga a página do meu projeto de 2016 e 2017 (Lab Z Games) que trará vários servidores OTServs.

 

Atenciosamente,
Adriano Swatt'

 

Para ver meus tutoriais acesse meu perfil.

 

cbCyOSZ.png

Link para o post
Compartilhar em outros sites

re up desculpa a demora ent faça do jeito de vcs qal fica melhor eu do rep mas caso eu do rep nois 3 ;D agredeço des de ja estava sem tempo de entra

Link para o post
Compartilhar em outros sites
  • Solução

Optei por fazer uma premiação justa - assim, é possível que haja mais de um ganhador em alguma(s) colocação(ões). Se isto ocorrer, o prêmio em dinheiro será dividido automaticamente entre os ganhadores.

Ex.:

Número sorteado: 48

Jogadores participando do evento: {Fulano, escolheu número 32}, {Ciclano, número 47}, {Error, número 49}, {Troglodita, número 30}, {zipter, número 29}.

Assim, a colocação ficará:

[1 lugar] = Ciclano e Error (o dinheiro será dividido entre ambos)

[2 lugar] = Fulano

[3 lugar] = Troglodita

A configuração, como pode ver, é simples:

    winners = {
        [colocação] = {cash = prêmio_em_dinheiro, items = {ID do item prêmio, quantidade do item prêmio}},   
    },

Enfim, vamos ao código:

Talkaction:

local storages = {8932, 8931}
local price = 100000              --Preço para participar do sorteio.
function onSay(cid, words, param)
    if getGlobalStorageValue(storages[1]) < 1 then
        return doPlayerSendCancel(cid, "Event is not on.")
    elseif getPlayerStorageValue(cid, storages[2]) > -1 then
        return doPlayerSendCancel(cid, "You already chose your number.")
    elseif param == "" or not tonumber(param) or tonumber(param) < 1 or tonumber(param) > 100 then
        return doPlayerSendCancel(cid, "/sorteio 1-100")
    elseif getPlayerMoney(cid) < price then
        return doPlayerSendCancel(cid, "You do not have enough money ("..price..").")
    end
    setPlayerStorageValue(cid, storages[2], tonumber(param))
    doPlayerRemoveMoney(cid, price)
    doPlayerSendTextMessage(cid, 27, "Agora você está participando do evento, seu número: "..param..", Aguarde o resultado, Boa sorte!")
    return true
end
Tag:
<talkaction words="/sorteio" event="script" value="nome_do_arquivo.lua"/>
Globalevent:
local config = {
    days = {"Monday", "Tuesday", "Saturday"},                 --Dias que o evento ocorrerá.
    time = 5,                                                 --Tempo para o sorteio ocorrer.
    winners = {
        --[place] = {cash = xxx, items = {itemid, count}},   
    },
    storages = {8931, 8932},
}
function getRuffleNumbers(a)
    local z = {}
    local c = {}
    for _, cid in pairs(getPlayersOnline()) do
        if getPlayerStorageValue(cid, config.storages[1]) > -1 then
            table.insert(z, math.abs(getPlayerStorageValue(cid, config.storages[1]) - a))
        end
    end
    for i = 1, #config.winners do
        for j = 1, #z do
            if not table.find(c, z[j]) then
                if not c[i] then
                    c[i] = z[j]
                else
                    if z[j] < c[i] then
                        c[i] = z[j]
                    end
                end
            end
        end
    end
    return c
end
function onTime()
    if isInArray(config.days, os.date("%A")) then
        broadcastMessage("O evento do sorteio iniciou, diga /sorteio numero(de 1 a 100) para escolher seu numero, em aproximadamente 5 minutos saira o resultado!")
        setGlobalStorageValue(config.storages[2], 1)
        addEvent(function()
            local a = math.random(1, 100)
            if #getRuffleNumbers(a) < 1 then
                broadcastMessage("Ninguém participou do sorteio. :/")
                setGlobalStorageValue(config.storages[2], -1)
            else
                broadcastMessage("E o número sorteado foi... "..a.."! Os ganhadores foram:")
                local c = getRuffleNumbers(a)   
                for i = 1, #c do
                    local players, p, gold = {}, "", 0
                    gold = config.winners[i].cash
                    for _, cid in pairs(getPlayersOnline()) do
                        if getPlayerStorageValue(cid, config.storages[1]) > -1 then
                            if getPlayerStorageValue(cid, config.storages[1]) == math.abs(c[i] - a) or getPlayerStorageValue(cid, config.storages[1]) == math.abs(c[i] + a) then
                                table.insert(players, cid)
                                doPlayerAddItem(cid, config.winners[i].items[1], config.winners[i].items[2])
                            end
                            setPlayerStorageValue(cid, config.storages[1], -1)
                        end
                    end    
                    for j = 1, #players do
                        gold = math.floor(config.winners[i].cash / #players)
                        doPlayerAddMoney(players[j], gold)
                        if p == "" then
                            p = getCreatureName(players[j])
                        else
                            p = p..(j == #players and " and" or ",").." "..getCreatureName(players[j])
                        end
                    end
                    broadcastMessage(i.." lugar: "..p.." - cash: "..gold.." - item: "..config.winners[i].items[2].."x "..getItemNameById(config.winners[i].items[1])..".")
                end
            end
            local query = db.getResult("SELECT id, online FROM players")
            if query:getID() == -1 then
                return true
            end
            repeat
                local online = query:getDataInt("online")
                local i = query:getDataInt("id")
                if online < 1 then
                    db.executeQuery("UPDATE player_storage SET value = -1 WHERE key = "..config.storages[1].." AND value > -1 AND player_id = "..i)
                end
            until not query:next()
            query:free()
        end, config.time * 60 * 1000)
    end
    return true
end
Tag:
<!-- Coloque, em time, o horário 5 minutos antes do sorteio ser realizado. -->
<!-- Por exemplo, se colocar 19:55, o sorteio vai ser realizado as 20:00. -->
<globalevent name="Sorteio" time="19:55" event="script" value="nome_do_arquivo.lua"/>
OBS: Testei o código apenas em situações hipotéticas (como aquele exemplo no começo do post) num depurador de lua.
Editado por zipter98 (veja o histórico de edições)

não respondo pms solicitando suporte em programação/scripting

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