Ir para conteúdo
  • 0

[PEDIDO] Item aleatorio


wougoplex

Pergunta

10 respostass a esta questão

Posts Recomendados

  • 0
5 minutos atrás, DuuhCarvalho disse:

 

como assim ? do nada vai aparecer um item na posição x ?

Sim Por Exemplo uma Arvore ela pode nascer em qualquer lugar do mapa Aleatorio Cada vez que reiniciar o server a arvore muda de lugar

1 hora atrás, DuuhCarvalho disse:

 

como assim ? do nada vai aparecer um item na posição x ?

Preciso Mt desse script se puder ajudar do rep+ Preciso pro meu prefession system

Link para o comentário
Compartilhar em outros sites

  • 0

Antes de mais nada, vou explicar a lógica por trás do código que escrevi e sua configuração.

 

Tome a seguinte imagem como referência:

24g6d0g.jpg

 

As posições que serão consideradas no "sorteio" estão contidas na área do quadrilátero (representado em azul). Por isso, para delimitar essa área do restante do mapa que não será considerado tomamos como pontos de referência os vértices A e B. No código que postarei a seguir, você deve colocar em fromPos as coordenadas do ponto A (ponto superior esquerdo da área), e em toPos as coordenadas do ponto B (ponto inferior direito da área).

Também optei por imprimir a posição escolhida na distro, facilitando sua busca.

 

data/globalevents/scripts:

local config = {    itemid = xxx,                                        --ID do item criado.    edges = {        fromPos = {x = x, y = y, z = z},                --Coordenadas da posição superior esquerda.        toPos = {x = x, y = y, z = z}                   --Coordenadas da posição inferior direita.    }}function isWalkable(pos, creature, proj, pz, water)-- by Nord    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end    if getTopCreature(pos).uid > 0 and creature then return false end    if getTileInfo(pos).protection and pz then return false, true end    local n = not proj and 3 or 2    for i = 0, 255 do        pos.stackpos = i        local tile = getTileThingByPos(pos)        if tile.itemid ~= 0 and not isCreature(tile.uid) then            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then                return false            end        end    end    return trueendfunction getRandomPos(f, t)    local pos = {x = math.random(f.x, t.x), y = math.random(f.y, t.y), z = math.random(f.z, t.z)}        if not isWalkable(pos, true, true, true, true) then        pos = getRandomPos(f, t)    end        return posendfunction onStartup()    local pos = getRandomPos(config.edges.fromPos, config.edges.toPos)    print("Coordenadas selecionadas para o item "..getItemNameById(config.itemid)..":")    print("X: "..pos.x..", Y: "..pos.y..", Z: "..pos.z)        doCreateItem(config.itemid, 1, pos)    return trueend

Tag:

<globalevent name="randompos" type="start" event="script" value="nome_do_arquivo.lua"/>

 

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0
2 horas atrás, zipter98 disse:

Antes de mais nada, vou explicar a lógica por trás do código que escrevi e sua configuração.

 

Tome a seguinte imagem como referência:

24g6d0g.jpg

 

As posições que serão consideradas no "sorteio" estão contidas na área do quadrilátero (representado em azul). Por isso, para delimitar essa área do restante do mapa que não será considerado tomamos como pontos de referência os vértices A e B. No código que postarei a seguir, você deve colocar em fromPos as coordenadas do ponto A (ponto superior esquerdo da área), e em toPos as coordenadas do ponto B (ponto inferior direito da área).

Também optei por imprimir a posição escolhida na distro, facilitando sua busca.

 

data/globalevents/scripts:


local config = {
    itemid = xxx,                                        --ID do item criado.
    edges = {
        fromPos = {x = x, y = y, z = z},                --Coordenadas da posição superior esquerda.
        toPos = {x = x, y = y, z = z}                   --Coordenadas da posição inferior direita.
    }
}

function isWalkable(pos, creature, proj, pz, water)-- by Nord
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
    if getTopCreature(pos).uid > 0 and creature then return false end
    if getTileInfo(pos).protection and pz then return false, true end
    local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i
        local tile = getTileThingByPos(pos)
        if tile.itemid ~= 0 and not isCreature(tile.uid) then
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end
    return true
end

function getRandomPos(f, t)
    local pos = {x = math.random(f.x, t.x), y = math.random(f.y, t.y), z = math.random(f.z, t.z)}
    
    if not isWalkable(pos, true, true, true, true) then
        pos = getRandomPos(f, t)
    end
    
    return pos
end

function onStartup()
    local pos = getRandomPos(config.edges.fromPos, config.edges.toPos)

    print("Coordenadas selecionadas para o item "..getItemNameById(config.itemid)..":")
    print("X: "..pos.x..", Y: "..pos.y..", Z: "..pos.z)
    
    doCreateItem(config.itemid, 1, pos)
    return true
end

Tag:


<globalevent name="randompos" type="start" event="script" value="nome_do_arquivo.lua"/>

 

Vo testar rep+ por ajudar

@zipter98 Uma Coisa se n for encomodo tem como botar pra spawnar mais de 1 item no local selecionado ?

Link para o comentário
Compartilhar em outros sites

  • 0
54 minutos atrás, zipter98 disse:

Itens diferentes em posições próximas ou em posições também sorteadas pelo código?

Seja qual for a resposta, sim, dá.

Pode ser Sorteada pelo codigo Tipo nascer 3 item em posição diferente dentro dessa area

Editado por wougoplex
Link para o comentário
Compartilhar em outros sites

  • 0
local config = {    itemid = {xxx, xxx, xxx, ...},                      --Configure nessa tabela o ID dos itens.    edges = {        fromPos = {x = x, y = y, z = z},                --Coordenadas da posição superior esquerda.        toPos = {x = x, y = y, z = z}                   --Coordenadas da posição inferior direita.    }}function isWalkable(pos, creature, proj, pz, water)-- by Nord    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end    if getTopCreature(pos).uid > 0 and creature then return false end    if getTileInfo(pos).protection and pz then return false, true end    local n = not proj and 3 or 2    for i = 0, 255 do        pos.stackpos = i        local tile = getTileThingByPos(pos)        if tile.itemid ~= 0 and not isCreature(tile.uid) then            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then                return false            end        end    end    return trueendfunction getRandomPos(f, t)    local pos = {x = math.random(f.x, t.x), y = math.random(f.y, t.y), z = math.random(f.z, t.z)}        if not isWalkable(pos, true, true, true, true) then        pos = getRandomPos(f, t)    end        return posendfunction onStartup()    local pos = {}        for i = 1, #config.itemid do        table.insert(pos, getRandomPos(config.edges.fromPos, config.edges.toPos))    end        for i = 1, #pos do          print("Coordenadas selecionadas para o item "..getItemNameById(config.itemid[i])..":")        print("X: "..pos[i].x..", Y: "..pos[i].y..", Z: "..pos[i].z)                doCreateItem(config.itemid[i], 1, pos[i])    end    return trueend

 

Link para o comentário
Compartilhar em outros sites

  • 0
Em 04/12/2016 at 01:36, zipter98 disse:

Itens diferentes em posições próximas ou em posições também sorteadas pelo código?

Seja qual for a resposta, sim, dá.

Deu Erro 

 

[Error - GlobalEvent Interface]

data/globalevents/scripts/bau.lua:onStartup

Description:

data/globalevents/scripts/bau.lua:40: attempt to get length of field 'itemid' (a number value)

stack traceback:

        data/globalevents/scripts/bau.lua:40: in function <data/globalevents/scripts/bau.lua:37>

 

 

script como ta 

Spoiler

local config = {

    itemid = 15942,                                        --ID do item criado.

    edges = {

        fromPos = {x = 1065, y = 998, z = 7},                --Coordenadas da posição superior esquerda.

        toPos = {x = 1081, y = 1010, z = 7}                   --Coordenadas da posição inferior direita.

    }

}

function isWalkable(pos, creature, proj, pz, water)-- by Nord

    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end

    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end

    if getTopCreature(pos).uid > 0 and creature then return false end

    if getTileInfo(pos).protection and pz then return false, true end

    local n = not proj and 3 or 2

    for i = 0, 255 do

        pos.stackpos = i

        local tile = getTileThingByPos(pos)

        if tile.itemid ~= 0 and not isCreature(tile.uid) then

            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then

                return false

            end

        end

    end

    return true

end

function getRandomPos(f, t)

    local pos = {x = math.random(f.x, t.x), y = math.random(f.y, t.y), z = math.random(f.z, t.z)}

    

    if not isWalkable(pos, true, true, true, true) then

        pos = getRandomPos(f, t)

    end

    

    return pos

end

function onStartup()

    local pos = {}

    

    for i = 1, #config.itemid do

        table.insert(pos, getRandomPos(config.edges.fromPos, config.edges.toPos))

    end

    

    for i = 1, #pos do  

        print("Coordenadas selecionadas para o item"..getItemNameById(config.itemid)..":")

        print("X: "..pos.x..", Y: "..pos.y..", Z: "..pos.z)

        

        doCreateItem(config.itemid, 1, pos)

    end

    return true

end

 

Editado por wougoplex
Link para o comentário
Compartilhar em outros sites

  • 0

Deu erro porque você conseguiu copiar o script errado. lol

Olhe a configuração do código que postei:

local config = {    itemid = {xxx, xxx, xxx, ...},                      --Configure nessa tabela o ID dos itens.    edges = {        fromPos = {x = x, y = y, z = z},                --Coordenadas da posição superior esquerda.        toPos = {x = x, y = y, z = z}                   --Coordenadas da posição inferior direita.    }}

 

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...