wougoplex 27 Postado Dezembro 3, 2016 Share Postado Dezembro 3, 2016 Preciso de um script que faz aparecer item aleatorio no mapa Link para o comentário https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/ Compartilhar em outros sites More sharing options...
0 wougoplex 27 Postado Dezembro 3, 2016 Autor Share Postado Dezembro 3, 2016 up Link para o comentário https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/#findComment-1708295 Compartilhar em outros sites More sharing options...
0 DuuhCarvalho 327 Postado Dezembro 3, 2016 Share Postado Dezembro 3, 2016 20 horas atrás, wougoplex disse: Preciso de um script que faz aparecer item aleatorio no mapa como assim ? do nada vai aparecer um item na posição x ? Link para o comentário https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/#findComment-1708303 Compartilhar em outros sites More sharing options...
0 wougoplex 27 Postado Dezembro 3, 2016 Autor Share Postado Dezembro 3, 2016 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 https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/#findComment-1708306 Compartilhar em outros sites More sharing options...
0 zipter98 1102 Postado Dezembro 4, 2016 Share Postado Dezembro 4, 2016 (editado) 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: 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 Dezembro 4, 2016 por zipter98 DanijoBR reagiu a isso 1 Link para o comentário https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/#findComment-1708323 Compartilhar em outros sites More sharing options...
0 wougoplex 27 Postado Dezembro 4, 2016 Autor Share Postado Dezembro 4, 2016 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: 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 https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/#findComment-1708328 Compartilhar em outros sites More sharing options...
0 zipter98 1102 Postado Dezembro 4, 2016 Share Postado Dezembro 4, 2016 Itens diferentes em posições próximas ou em posições também sorteadas pelo código? Seja qual for a resposta, sim, dá. Link para o comentário https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/#findComment-1708330 Compartilhar em outros sites More sharing options...
0 wougoplex 27 Postado Dezembro 4, 2016 Autor Share Postado Dezembro 4, 2016 (editado) 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 Dezembro 4, 2016 por wougoplex Link para o comentário https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/#findComment-1708333 Compartilhar em outros sites More sharing options...
0 zipter98 1102 Postado Dezembro 4, 2016 Share Postado Dezembro 4, 2016 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 https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/#findComment-1708338 Compartilhar em outros sites More sharing options...
0 wougoplex 27 Postado Dezembro 19, 2016 Autor Share Postado Dezembro 19, 2016 (editado) 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 Dezembro 19, 2016 por wougoplex Link para o comentário https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/#findComment-1709388 Compartilhar em outros sites More sharing options...
0 zipter98 1102 Postado Dezembro 19, 2016 Share Postado Dezembro 19, 2016 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 https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/#findComment-1709394 Compartilhar em outros sites More sharing options...
Pergunta
wougoplex 27
Preciso de um script que faz aparecer item aleatorio no mapa
Link para o comentário
https://xtibia.com/forum/topic/242901-pedido-item-aleatorio/Compartilhar em outros sites
10 respostass a esta questão
Posts Recomendados