Ir para conteúdo

zipter98

Herói
  • Total de itens

    2553
  • Registro em

  • Última visita

  • Dias Ganhos

    72

Tudo que zipter98 postou

  1. Parece que eu tinha feito isso no primeiro código que postei, mas o autor copiou errado, e, como copiei o dele para corrigir, acabei deixando isso passar. lol Obrigado, mesmo assim.
  2. Naquela parte da tabela, troque: targetItem = {target = 2711, newid = {17207, 17208, 17209, 17210, 17211, 17212}} por: targetItem = {target = 2711, newid = {17207, 17208, 17209, 17210, 17211, 17212}, transformBack = {17213, 17214, 17215, 2711}} Em transformBack, você configura, na ordem de transformação, o ID dos itens que fazem parte do crescimento da árvore. Depois, troque: doReturnItemsWithDelay(toPos, ProfessionId[getPlayerProfessionId(cid)].targetItem.target, 60) por: doReturnItemsWithDelay(toPos, ProfessionId[getPlayerProfessionId(cid)].targetItem.transformBack, 20, 1) 20 é o intervalo, em segundos, entre cada transformação. Na lib, troque: function doReturnItemsWithDelay(toPosition, itemid, times) local function doReturnItem(itemposition,oldid) local pos = getThingfromPos(itemposition) doTransformItem(pos.uid,oldid) doSetItemText(pos.uid, getItemNameById(oldid)) end addEvent(doReturnItem, times * 1000,toPosition, itemid)end por: function doReturnItemsWithDelay(toPosition, ids, time_interval, i) if i > #ids then return true end addEvent(function() local item = getThingfromPos(toPosition).uid doTransformItem(item, ids[i]) addEvent(doReturnItemsWithDelay, time_interval * 1000, toPosition, ids, time_interval, i + 1) end, time_interval * 1000)end
  3. Os itens que farão parte da etapa de crescimento da árvore são os mesmos da tabela newid, só que transformados de forma oposta?
  4. @Josegvb Ah sim, não reparei que o mesmo erro do código do wougoplex estava no seu. Escrever vários códigos quase simultaneamente acaba me distraindo um pouco, desculpe. Troque: local ids = ProfessionId[getPlayerProfessionId(cid)].targetItem.newid for i = 1, #ids do addEvent(doTransformItem, i * 100, getThingFromPos(toPos).uid, ids[i]) end por: local ids = ProfessionId[getPlayerProfessionId(cid)].targetItem.newid for i = 1, #ids do addEvent(function() doTransformItem(getThingFromPos(toPos).uid, ids[i]) end, i * 100) end E, pensando melhor, dá pra simplificar o script que escrevi para o wougoplex, ficando praticamente igual ao bloco de código acima (a funcionalidade é a mesma, no entanto). local ids = {19225, 19226, 19227, 19228, 19229, 19230, 19231, 19232} function onUse(cid, item, fromPosition, itemEx, toPosition) for i = 1, #ids do addEvent(function() doTransformItem(getThingFromPos(toPosition).uid, ids[i]) end, i * 100) --Aqui você ajusta o intervalo de tempo entre as transformações. A unidade de tempo é milissegundos. end return true end
  5. Transfira as seguintes linhas: if not move then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.") return trueend para acima de: if isInArray({1,2,3,4,5,6,7,8,9,10,11,12,13}, it) then
  6. Como não programo há tempos, foi mesmo bom eu ter resolvido testar o código. Primeiramente, aqui está o código corrigido do wougoplex: local ids = {19225, 19226, 19227, 19228, 19229, 19230, 19231, 19232}function onUse(cid, item, fromPosition, itemEx, toPosition) local old_id = item.itemid for i = 1, #ids do addEvent(function() local _item = getTileItemById(toPosition, old_id).uid if _item > 0 then doTransformItem(_item, ids[i]) old_id = ids[i] end end, i * 100) --Aqui você ajusta o intervalo de tempo entre as transformações. A unidade de tempo é milissegundos. end return trueend Josegvb, você errou na configuração da tabela. Troque: targetItem = {target = 2711, newid = 17207, 17208, 17209, 17210, 17211,17212} por: targetItem = {target = 2711, newid = {17207, 17208, 17209, 17210, 17211, 17212}} Troque, também: addEvent(doTransformItem, i * 100, getThingFromPos(toPos).uid, ids) por: addEvent(doTransformItem, i * 100, getThingFromPos(toPos).uid, ids[i]) Para que as transformações ocorram durante a ação, transfira essas linhas: local ids = ProfessionId[getPlayerProfessionId(cid)].targetItem.newidfor i = 1, #ids do addEvent(doTransformItem, i * 100, getThingFromPos(toPos).uid, ids[i])end para antes do: addEvent(function()
  7. Já irei testar o código e editar este comentário. PS: O código que você citou acima não é o que escrevi para você, como já disse antes.
  8. Ugh, esqueci de reescrever a parte de baixo do código com base na nova estrutura da tabela. Estou meio enferrujado, desculpe-me.
  9. Se você quis dizer premium account (muita gente confunde), acima de: if(doPlayerRemoveMoney(cid, price)) then doTeleportThing(cid,pos) doSendMagicEffect(pos, CONST_ME_TELEPORT)else selfSay('Você nao tem dinheiro suficiente, va matar magikarp e pegar seus loots.', cid)end coloque: if not isPremium(cid) then selfSay("You must have a premium account to teleport.", cid) return trueend
  10. Isso que você citou é minha resolução para o pedido do Josegvb. Para o seu, é a seguinte:
  11. Wow, tanto tempo sem scriptear me fez esquecer como funcionava o string.find. Troque: if p:find() == "lista" then por: if p:find("lista") then
  12. Para evitar que a ordem dos pokémon na lista seja aleatória (ou seja, para que seja mostrada exatamente na ordenação que você configurou), é melhor estruturar a tabela de outra forma: local pokemon = { {name = "nome_do_pokémon", price = xxx, boost = xxx}, --etc} Depois, troque: if p == "lista" then local str = "******** You can buy: ********" for p_name, info in pairs(pokemon) do str = str.."\n-"..p_name.." [+"..info.boost.."] for "..info.price.." premium point(s)." end doPlayerPopupFYI(cid, str) por: if p:find("lista") then local str, n = "******** You can buy: ********", tonumber(p:explode(" ")[2]) if n > math.ceil(#pokemon / 15) then doPlayerSendCancel(cid, "There are only lists from 1 to "..math.ceil(#pokemon / 15)..".") return true end for i = (15 * (n - 1)) + 1, 15 * n do local poke = pokemon[i] if not poke then break end str = str.."\n-"..poke.name.." [+"..poke.boost.."] for "..poke.price.." premium point(s)." end doPlayerPopupFYI(cid, str) O comando para mostrar a lista será o seguinte: /comando lista n --Sendo n o número da lista. Cada lista contém 15 pokémon.
  13. De fato, esta mensagem é muito grande para um FYI. Troque: doPlayerPopupFYI(cid, str) por: doShowTextDialog(cid, 2160, str)
  14. Troque a linha que você destacou por essa: local ids = ProfessionId[getPlayerProfessionId(cid)].targetItem.newidfor i = 1, #ids do addEvent(doTransformItem, i * 100, getThingFromPos(toPos).uid, ids[i])end Agora, na lib, você deve substituir na tabela de profissões o valor newid por uma tabela contendo os itens da transformação. Por exemplo: targetItem = {target = 2706, newid = {2741, xxx, xxx, ...}}
  15. Seria algo assim? local ids = {19225, 19226, 19227, 19228, 19229, 19230, 19231, 19232}function onUse(cid, item) for i = 1, #ids do addEvent(doTransformItem, i * 100, item.uid, ids[i]) end return trueend A tag do código de premiação do baú seria algo do tipo: <action itemid="19232" event="script" value="código_de_premiação.lua"/>
  16. Supondo que, de fato, todas as funções tenham sido copiadas exatamente iguais (o código de box que você postou está incompleto, então me baseei no do PDA): local pokemon = { ["nome_do_pokémon"] = {price = xxx, boost = xxx}, --etc}function doCorrectString(str) --Slicer local name = str:explode(" ") local final = {} for _, s in ipairs(name) do table.insert(final, s:sub(1, 1):upper()..s:sub(2, #s):lower()) end return table.concat(final, (name[2] and " " or ""))endfunction onSay(cid, words, param) local p = param:lower() if p == "list" then local str = "******** You can buy: ********" for p_name, info in pairs(pokemon) do str = str.."\n-"..p_name.." [+"..info.boost.."] for "..info.price.." premium point(s)." end doPlayerPopupFYI(cid, str) elseif pokemon[doCorrectString(p)] then local poke = pokemon[doCorrectString(p)] if getAccountPoints(cid) < poke.price then doPlayerSendCancel(cid, "Sorry, you do not have enough points. ["..poke.price.." premium points]") return true end doPlayerSendTextMessage(cid, 27, "You successfully bought a "..doCorrectString(p).." [+"..poke.boost.."] for "..poke.price.." premium point(s).") doAccountRemovePoints(cid, poke.price) addPokeToPlayer(cid, doCorrectString(p), poke.boost, nil, "normal") else doPlayerSendCancel(cid, "Invalid parameter. Type 'list' to see a list of pokemon you can buy, or type the name of the wished pokemon.") end return trueend Algumas observações: Optei por deixar o código mais configurável. Você pode escolher os pokémon que podem ser comprados, junto com boost e preço específico. Essas informações são mostradas num parâmetro que incluí (/comando list). Logo, as opções de fala são: /comando nome_do_pokémon --Para comprar um pokémon./comando list --Para mostrar uma lista com os pokémon compráveis. Também, devo informar que os premium points não são compartilhados por outros personagens da conta. Para que isso aconteça, recomendaria instalar a função setAccountStorageValue, encontrada por aí na internet (acho que aqui no XTibia tem).
  17. Pelo que notei, há uma transformação de item: o baú fechado, visivelmente, se transforma no aberto. Poderia me confirmar se essa animação dele se abrindo faz parte do segundo item (o baú aberto)?
  18. 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
  19. Poderia me informar se existe alguma função que adiciona o pokémon para o jogador, como no PDA? Porque, caso não haja, gostaria de pedir que você postasse o código de uma daquelas box que dão um pokémon aleatório. Como nunca mexi nesse PDA open source, não conheço seus atributos e funções, por isso preciso de um outro script para me basear.
  20. Itens diferentes em posições próximas ou em posições também sorteadas pelo código? Seja qual for a resposta, sim, dá.
  21. Hm, e se adaptasse esse sistema para o uso de storages? Não vejo diferença prática, para falar a verdade (e database não é minha praia). Qualquer coisa, basta substituir a lib por: PREMIUM_POINT_KEY = 47371function getAccountPoints(cid) if not isPlayer(cid) then return true end local points = getPlayerStorageValue(cid, PREMIUM_POINT_KEY) return points < 0 and 0 or pointsendfunction doAccountAddPoints(cid, count) if not isPlayer(cid) then return true end return setPlayerStorageValue(cid, PREMIUM_POINT_KEY, getAccountPoints(cid) + count)endfunction doAccountRemovePoints(cid, count) if not isPlayer(cid) or getAccountPoints(cid) == 0 then return true end return setPlayerStorageValue(cid, PREMIUM_POINT_KEY, getAccountPoints(cid) - count)end Os outros códigos permanecem os mesmos.
  22. 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"/>
  23. Como não jogo Tibia, me baseei somente na informação que o autor havia dado (limitar o uso à certas áreas). Como, após meu post, o autor explicitou que as áreas necessariamente seriam aquelas com o atributo de no-pvp, de fato, sua alternativa acaba sendo mais adequada, visto que há um fator abrangente que descarta o uso de looping e tabelas. Porém, recomendaria apenas que não adotasse FALSE (destaque no case-sensitive) como um booleano. TRUE e FALSE são variáveis cujo valor são os verdadeiros booleanos: true e false. Apesar da funcionalidade ser a mesma (em servidores de Tibia, já que tais variáveis não são padrões em todas as fontes), é uma boa adotar logo o uso direto do booleano, como em: if getTileInfo(getThingPos(cid)).nopvp == false then ou, ainda melhor: if not getTileInfo(getThingPos(cid)).nopvp then Mas, novamente, ressalto que não há erros na estrutura que você escreveu.
  24. Abaixo de: function onSay(cid, words, param, channel) coloque: local posis = { --Abaixo você configura, respectivamente, as coordenadas da posição superior esquerda (fromPos) e inferior direita (toPos) das áreas. {fromPos = {x = x, y = y, z = z}, toPos = {x = x, y = y, z = z}}, {fromPos = {x = x, y = y, z = z}, toPos = {x = x, y = y, z = z}}, {fromPos = {x = x, y = y, z = z}, toPos = {x = x, y = y, z = z}}, --etc}local check_posfor 1, #posis do if isInArea(getThingPos(cid), posis[i].fromPos, posis[i].toPos) then check_pos = true break endendif not check_pos then doPlayerSendCancel(cid, "You must be in some training room to use this command.") return trueend
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...