Ir para conteúdo

nickmendes

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    nickmendes deu reputação a GoTheHell em O que é mapear? - Parte dois   
    Eai galera beleza? Hoje eu vou estar trazendo a segunda parte de vários tutorias explicando o que é e como funciona a arte de mapear.
     

     
    Os tópicos que serão tratadas são:
    --> Como funciona o Remere’s Map Editor (RME);
    --> Como utilizar o Remere’s Map Editor (RME);
    --> Como dar início a um mapa;
    --> Observações sobre o RME.
     

     
    1º Como funciona o Remere’s Map Editor (RME)?
                    RME é um programa destinado para criar mapas (como foi citado no primeiro tutorial).
    Isso é realmente uma coisa bem obvia, mas pare mapear o programa disponibiliza para nos diferentes abas, com diferentes classificações.
                    Na verdade este programa está dividido em Terrain Pallet, Doodad Pallet, Item Pallet, House Pallete, Waypoint Pallete, Creature Pallete e por fim RAW Pallete, e cada uma dessas palhetas possuem mais outras palhetas dentro, dividindo em diversas outras coisas.



                    Além disso, existem a configurações que geralmente não vemos.
                    Nesta parte (figura abaixo) podemos encontrar muitas coisas importantes, tais como as configurações, os últimos mapas que você abriu, a função de salvar (atalho ctrl+s) e abrir o mapa (atalho ctrl+o).  Outras coisas que podem ajudar, bastante, se encontram em view. Por fim, mas não menos importante, existe, em algumas versões do RME, a função de Live, a qual permite você mapear com algum amigo.




                   
     
    2º Como utilizar o Remere’s Map Editor (RME).
                    A utilização do RME é muito fácil, de uma forma similar a paint. Você escolhe o que vai usar e começa a brincar.
     

     
    3º Como dar início a um mapa.
                    Normalmente para começar a criar um mapa você precisa ter alguma coisa em mente. Vamos imaginar que você queira uma casa, e que está casa esteja em uma parte mais distante de uma cidade.
                    Estarei mostrando duas imagens, uma com auto-border e outra sem.



    Como podemos ver, o mapa que foi feita com auto-border não possui um detalhamento muito bom, além de estar muito feio. Por outro lado, o mapa o qual não foi feito com auto-border está mais “pacifico” e “calmo”, sem excesso de coisas no mapa.
    Primeiramente, como devemos criar uma casa neste estilo?
    A coisa mais básica é criar o ground que você precisa. No caso, é uma casa mais afastada da cidade, só podemos pensar que é no meio do mato.



    Após criar algum lugar para construir a casa, devemos criar algum caminho para chegar a casa. Agora vem a parte que pode demorar um pouco. Vá para RAW Pallete, e logo em seguida em borders. Após entrar em borders, procure pelas bordas da grama. Após isso comece a colocar estas bordas, fazendo com que elas pareçam um caminho. Caso não consigam tentem copiar a imagem. Logo após fazer as bordas, colocar um ground de terra.



    Logo após isso, demos detalhar o caminho, adicionando gravel. Como fazer isso? Simples, na mesma palheta em que se encontra, RAW Pallete, procure por exterior, depois procure por debris (ID: 6476-6488) faça como a imagem mostra.



    Criado o caminho, temos que criar a estrutura da casa, além da natureza em volta da casa. Para criar a estrutura da casa, na mesma palheta, procure por walls, e escolha a parede que mais lhe agrade. Escolhida a parede, coloque-a de forma mais simples possível, como por exemplo um retângulo ou quadrado. Para fazer a natureza, vamos começar adicionando apenas a graminha. Esta se encontra em Nature (ID: 6219 e 6218) e adicione-os.



    Como vocês podem ver, eu misturei duas paredes. Pois é, podemos fazer o que a imaginação quiser. Também coloquei tufinhos de grama ao redor da casa. Isto era para ser uma casa no meio da natureza. Então vamos adicionar árvores e flores.



    Esta imagem está muito verde, não? Então para remover “este aspecto de verde" que tal adicionar um pouco de água? Na parte de bordas (borders) procure pela borda de água (4644-4654) e adicione-as. Caso não consiga tente fazer que nem a imagem.



    Terminado a adição de bordas, deveríamos melhorar a casa, pois esta vazia e sem graça. Na parte de Interior, a maioria dos items necessários para colocar dentro da casa estão. Outra coisa a ser notada, é que a casa está sem janelas, então devemos adiciona-las.



    Seguindo todos os passos, o seu mapa pode ter o mesmo resultado do mostrado a cima.
     

     
    *Observações sobre o RME.
                    Como podemos ver na imagem abaixo, existem duas divisões, quando estamos na Terrain Pallete, que são chamadas de Tools (ferramentas) e Brush Size (Quantidade de tiles). Nestas duas divisões existem vários quadradinhos. Irei citar as funções que mais são importantes.



                    Border -> Cria bordas automaticamente. –Não recomendo utilizar.
                    Erase -> Apaga tiles.
                    Pz -> Adiciona proteção a um tile.
                    No-pvp -> Faz com que o tile fique sem pvp.
                    Logout -> O player não pode deslogar quando está função estiver em um tile
                    Pvp -> Faz com que o tile seja pvp.
     
                    Sinceramente o Brush Size, na minha opinião, não é muito relevante, mas para quem quiser saber, é uma função que faz com que você consiga adicionar mais de um tile de uma vez.
     

     
    Espero que gostem
    Terceiro tutorial (parte 1) ->
    <- Primeiro Tutorial
  2. Gostei
    nickmendes deu reputação a Absolute em [UP-LEVEL] Recompensa ao subir de level   
    Fala TKZIANOS de plantão WTF? AUEHAUHEA Mas ok...
     
    Venho hoje trazer a vocês um sistema de ganhar uma recompensa ao conquistar determinado nível (Configurável)
     
     
    Como funciona?

    Quando o jogador conquistar determinado level ele recebe como recompensa X item ou GOLD!
    Mais Absolute, o cara vai ficar se matando e upando de novo para ficar pegando a recompensa... NÃO! Quando o player conquista o level ele recebe uma STORAGE, essa storage faz com que salve isto, ou seja faz com que marque que o jogador já recebeu, se ele tentar burlar o sistema ele não vai receber pelo fato da tal STORAGE já estar gravada nele =p
     
     
     
    Em data/creaturescripts/scripts crie um arquivo chamado uplevelabsolute.lua e coloque o seguinte dentro:
     
    function onAdvance(cid, skill, oldLevel, newLevel) local config = { [50] = {item = 2160, count = 5}, [100] = {item = 2160, count = 15}, [150] = {item = 2160, count = 20}, [200] = {item = 2160, count = 25}, [250] = {item = 2160, count = 30}, [300] = {item = 2160, count = 50}, [350] = {item = 4891, count = 1}, [400] = {item = 4892, count = 1}, } if skill == 8 then for level, info in pairs(config) do if newLevel >= level and (getPlayerStorageValue(cid, 30700) == -1 or not (string.find(getPlayerStorageValue(cid, 30700), "'" .. level .. "'"))) then doPlayerAddItem(cid, info.item, info.count) doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Parabéns, você atingiu o level "..newLevel.." e ganhou "..info.count.." "..getItemNameById(info.item)..".") local sat = getPlayerStorageValue(cid, 30700) == -1 and "Values: '" .. level .. "'" or getPlayerStorageValue(cid, 30700) .. ",'" .. level .. "'" setPlayerStorageValue(cid, 30700, sat) end end end return TRUE end Em data/creaturescripts/creaturescripts.xml adicione a seguinte linha:
    <event type="advance" name="UpAbsolute" event="script" value="uplevelabsolute.lua"/> Em data/creaturescripts/scripts/login.lua abaixo de registerCreatureEvent(cid, "Mail") adicione a seguinte linha:
    registerCreatureEvent(cid, "UpAbsolute") Pronto, você implantou o sistema em seu servidor.

     

    Como configurar:
    [50] = {item = 2160, count = 5}, [50] = level que o player vai receber a tal recompensa
    2160 = item que o player vai receber, no caso 2160 é o Crystal Coin
    count = 5 = quantidade do item, no caso 5 Crystal Coins
     
     
     
    Observação: Ao atingir o level o player receberá uma mensagem e o prêmio estará diretamente em sua backpack.

     
     
     
    Qualquer dúvida peço que poste =D
     
     
     
    Até o próximo sisteminha bb's.
  3. Gostei
    nickmendes deu reputação a Garou em Perfect Upgrade System   
    Nome: Perfect Upgrade System
    Tipo: Biblioteca, Action, Sistema
    Autor: Oneshot
    Essa é a versão final do Perfect Refine System ou Perfect Upgrade System criado por mim.
    É um sistema construído em cima de funções em POO (orientação a objetos), o que o torna muito versátil, possibilitando a outros programadores/scripters criarem seus próprios sistemas com base na biblioteca.
    A função do sistema é simples. Não passa de um sistema de refino, presente em todos os servidores, onde você usa um item em um equipamento e este fica mais forte e ganha um nome caracterizando o nível de força - bem clichê - mas muito interessante.
    Meu sistema é um pouco diferente dos outros, pois possui algumas características exclusivas, listadas abaixo:
    O nível máximo configurável é praticamente ilimitado O sistema funciona com armas de combate corpo-a-corpo, bows e crossbows. O refino pode falhar, não acontecendo nada, regredindo o nível ou resetando ele. Há um sistema nativo de broadcasts, que são enviados quando um jogador consegue refinar um equipamento até um certo nível ou maior. As chances são configuradas manualmente e sua randomização é muito precisa. Há dois modos de instalar o sistema em seu servidor, o primeiro é baixar a pasta com os scripts necessários e apenas copiar as chaves nos arquivos XMLs ou então seguir o curto tutorial de instalação.
    Crie um arquivo chamado upgradesystem.lua na pasta data/lib e copie o conteúdo abaixo:
      --[[ PERFECT UPGRADE SYSTEM 2.0 Criado por Oneshot É proibido a venda ou a cópia sem os devidos créditos desse script. ]]-- UpgradeHandler = { levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true}, [11] = {10, true, true}, [12] = {5, true, true} }, broadcast = 7, attributes = { ["attack"] = 2, ["defense"] = 1, ["armor"] = 1 }, message = { console = "Trying to refine %s to level +%s with %s%% success rate.", success = "You have upgraded %s to level +%s", fail = "You have failed in upgrade of %s to level +%s", downgrade = "The upgrade level of %s has downgraded to +%s", erase = "The upgrade level of %s has been erased.", maxlevel = "The targeted %s is already on max upgrade level.", notupgradeable = "This item is not upgradeable.", broadcast = "The player %s was successful in upgrading %s to level +%s.\nCongratulations!!", invalidtool = "This is not a valid upgrade tool.", toolrange = "This upgrade tool can only be used in items with level between +%s and +%s" }, tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, }, isEquipment = function(self) local weaponType = self:getItemWeaponType() return ((weaponType > 0 and weaponType < 7) or self.item.armor ~= 0) end, setItemName = function(self, name) return doItemSetAttribute(self.item.uid, "name", name) end, chance = function(self) local chances = {} chances.upgrade = (self.levels[self.item.level + 1][1] or 100) chances.downgrade = (self.item.level * 5) chances.erase = (self.item.level * 3) return chances end } function UpgradeHandler:new(item) local obj, ret = {} obj.item = {} obj.item.level = 0 obj.item.uid = item.uid for key, value in pairs(getItemInfo(item.itemid)) do obj.item[key] = value end ret = setmetatable(obj, {__index = function(self, index) if _G[index] then return (setmetatable({callback = _G[index]}, {__call = function(self, ...) return self.callback(item.uid, ...) end})) else return UpgradeHandler[index] end end}) if ret:isEquipment() then ret:update() return ret end return false end function UpgradeHandler:update() self.item.level = (tonumber(self:getItemName():match("%+(%d+)")) or 0) end function UpgradeHandler:refine(uid, item) if not self.item then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, self.message.notupgradeable) return "miss" end local tool = self.tools[item.itemid] if(tool == nil) then doPlayerSendTextMessage(uid, MESSAGE_EVENT_DEFAULT, self.message.invalidtool) return "miss" end if(self.item.level > #self.levels) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.maxlevel:format(self.item.name)) return "miss" end if(self.item.level < tool.range[1] or self.item.level >= tool.range[2]) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.toolrange:format(unpack(tool.range))) return "miss" end local chance = (self:chance().upgrade + tool.info.chance) doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, self.message.console:format(self.item.name, (self.item.level + 1), math.min(100, chance))) if(tool.info.removeable == true) then doRemoveItem(item.uid, 1) end if chance * 100 > math.random(1, 10000) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_ORANGE, self.message.success:format(self.item.name, (self.item.level + 1))) if (self.item.level + 1) >= self.broadcast then doBroadcastMessage(self.message.broadcast:format(getCreatureName(uid), self.item.name, (self.item.level + 1))) end self:setItemName((self.item.level > 0 and self:getItemName():gsub("%+(%d+)", "+".. (self.item.level + 1)) or (self:getItemName() .." +1"))) for key, value in pairs(self.attributes) do if getItemAttribute(self.item.uid, key) ~= nil or self.item[key] ~= 0 then doItemSetAttribute(self.item.uid, key, (self.item.level > 0 and getItemAttribute(self.item.uid, key) or self.item[key]) + value) end end return "success" else if(self.levels[self.item.level][3] == true and (self:chance().erase * 100) > math.random(1, 10000)) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.erase:format(self.item.name)) self:setItemName(self.item.name) for key, value in pairs(self.attributes) do if self.item[key] > 0 then doItemSetAttribute(self.item.uid, key, self.item[key]) end end elseif(self.levels[self.item.level][2] == true and (self:chance().downgrade * 100) > math.random(1, 10000)) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.downgrade:format(self.item.name, (self.item.level - 1))) self:setItemName((self.item.level == 1 and self.item.name or self:getItemName():gsub("%+(%d+)", "+".. (self.item.level - 1)))) for key, value in pairs(self.attributes) do if getItemAttribute(self.item.uid, key) ~= nil or self.item[key] ~= 0 then doItemSetAttribute(self.item.uid, key, (self.item[key] + value * (self.item.level - 1))) end end else doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.fail:format(self.item.name, (self.item.level + 1))) end return "fail" end end Crie um arquivo chamado upgrade.lua em data/actions/scripts e cole o conteúdo abaixo:
      function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then return doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE) end local obj = UpgradeHandler:new(itemEx) if(obj == false) then return doPlayerSendCancel(cid, UpgradeHandler.message.notupgradeable) end local status = obj:refine(cid, item) if status == "success" then --doSendAnimatedText(toPosition, "Success!", COLOR_GREEN) doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN) elseif status == "fail" then --doSendAnimatedText(toPosition, "Fail!", COLOR_RED) doSendMagicEffect(toPosition, CONST_ME_POFF) else doSendMagicEffect(toPosition, CONST_ME_POFF) end return true end No arquivo actions.xml, cole a seguinte linha:
      <action itemid="8306" event="script" value="upgrade.lua"/> Para adicionar mais níveis de refino no sistema, edite a seguinte tabela:
      levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true} }, Por padrão, ela já está configurado como na maioria dos MMORPGs, 10 níveis de refino, com chances de sucesso, regressão e "quebra". Mas se você quiser, por exemplo, adicionar mais dois níveis, siga o modelo, sempre colocando uma vírgula no final com exceção da última linha da tabela:
      levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true}, [11] = {10, true, true}, [12] = {5, true, true} }, O primeiro valor é chance de sucesso, o segundo se o item pode regredir na tentativa e o terceiro é se o item para "quebrar" (perder todo o nível de refino). Para criar novas ferramentas (itens) de refinar, configure a tabela abaixo:
      tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, }, Seguindo o mesmo esquema da tabela anterior, vírgulas em todas as linhas com exceção da última, seguindo o modelo abaixo. Por exemplo, uma ferramenta de ID 8303 que refine do level +6 ao +10, que dê 10% de chance bônus e que seja finita, eu faço assim:
      tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, [8310] = {range = {6, 10}, info = {chance = 10, removeable = true}} }, Em breve vídeo de demonstração com sistema em funcionamento.
    Perfect Upgrade System.rar
  4. Gostei
    nickmendes deu reputação a JhonatanCWest em [Tutorial] Explicando e Criando Vocações   
    Olá TibiaKing,

    Vi muitas pessoas com dúvidas, mesmo contendo tutoriais, não entendiam,então tentarei fazer um bom tutorial.

    Ok, vamos por a mão na massa!

    Basicamente nós nos basearemos nisso:
    Localizado em: DATA/XML/VOCATION.XML

    Exemplo


    Primeiro vou explicar cada item pra você criar sua vocação certinha!

    id = não deve haver nenhuma igual, tente seguir a sequencia para não se perder.
    name = nome da nova vocação.
    description = quando der look aparecera esse nome, e caso acc manager também.
    needpremium = se precisa de premmium para ter essa vocação (0 = não 1 = sim)
    gaincap = o tanto de cap que vai ganhar quando upar
    gainhp = o tanto de vida que vai ganhar quando upar
    gainmana = o tanto de mana que vai ganhar quando upar
    gainhpticks = o tanto de segundos que demora pra subir a vida
    gainhpamount = o tanto de vida que vai ganhar a cada ( no nosso exemplo 6 ) segundos
    gainmanaticks = o tanto de segundos que demora pra subir a mana
    gainmanaamount = o tanto de mana que vai ganhar a cada ( no nosso exemplo 3 ) segundos
    manamultiplier = quanto ml vai demorar pra subir, quanto menor mais rápido
    attackspeed = velocidade do ataque de wands e weapons (quanto menor mais rápido)
    soulmax = o maximo de soul
    gainsoulticks = o tanto de segundos que vai demorar pra subir o soul
    fromvoc = como ele será reconhecido nos scripts ( bote igual o id )

    Formulas:

    meleeDamage = quanto hita com weapons ( exceto wands e rods )
    distDamage = quanto hita com ataques a distancia
    wandDamage = quando hita com wand
    magDamage = quando hita com magias
    magHealingDamage = quanto heala com magias de cura, ( tanto exura como exura sio )
    defense = quanto defende com escudos
    armor = quanto defende com armaduras

    Skill Ids:

    (0) Fist
    (1) Club
    (2) Sword
    (3) Axe
    (4) Distance
    (5) Shield
    (6) Fishing

    PS: Quando menor o skill multiplier, mais rápido upa os skills.

    Criando nova vocação :
    1. Basta você adicionar nosso exemplo, embaixo das vocations.

    Exemplo



    Adicionando Spells às novas vocações
    2. Basta adicionar o nome da nova vocação em: data/spells/spells.xml

    Exemplo



    Tutorial criado por mim, exceto a parte dos Skill_ids, que peguei de outros tutos.
    Pronto, espero ter ajudado.
    Se gostaram agradeçam por favor.
    Obrigado, JhonatanCWest
  5. Gostei
    nickmendes deu reputação a L3K0T em Itens Iniciais   
    Uso esse é só jogar em MODS e só alegria espero ter ajudado, se não gostar é só mudar os id dos itens sem bug perfeito eu mesmo que arrumei vlws até mais.
     
    cria um arquivo com o nome Firstitems.xml e joga isso lá dentro da pasta MODS
     
    <?xml version="1.0" encoding="UTF-8"?>
    <mod name="First Items" version="1.0" author="Tibia Brasil OT" contact="[email protected]" enabled="yes">
        <config name="firstitems_config"><![CDATA[
            config = {
                storage = 30001,
                items = {2050, 2382}
            }
        ]]></config>
        <event type="login" name="FirstItems" event="script"> <![CDATA[
            domodlib('firstitems_config')

            function onLogin(cid)
        local config = {
            voc_items = {
                { -- SORC
                                    {2175}, -- spellbook
                    {2190}, -- wand of vortex
                    {8820}, -- mage hat
                    {8819}, -- mage robe
                                    {2148, 150} -- Gold Coins
                },
                { -- DRUID
                    {2175}, -- spellbook
                    {2182}, -- snakebite rod
                    {8820}, -- mage hat
                    {8819}, -- mage robe
                                    {2148, 150} -- Gold Coins
                },
                { -- PALADIN
                    {2530}, -- copper shield
                    {2389, 5}, -- Spears
                    {2480}, -- legion helmet
                    {2464}, -- chain armor
                                    {2148, 100} -- Gold Coins
                },
                { -- KNIGHT
                    {2409}, -- serpent sword
                    {2530}, -- copper shield
                    {2480}, -- legion helmet
                    {2464}, -- chain armor
                                    {2148, 150} -- Gold Coins
                }
            },
            all_items = {
                {2468}, -- studded legs
                {2643} -- leather boots
            },
            extra_items = {
                {2789, 15}, -- Brown Mushrooms
                {2120}, -- Rope
                {2554} -- Shovel
            },
            knight_weapons = {
                {2423}, -- clerical mace
                {2429} -- barbarian axe
            }
        }
        if getPlayerGroupId(cid) < 3 then
            if getPlayerStorageValue(cid, storage) == -1 then
                local common = config.voc_items[getPlayerVocation(cid)]
                if common ~= nil then
                    for _, v in ipairs(common) do
                        doPlayerAddItem(cid, v[1], v[2] or 1)
                    end
                end

                local all = config.all_items
                if all ~= nil then
                    for _, v in ipairs(all) do
                        doPlayerAddItem(cid, v[1], v[2] or 1)
                    end
                end

                local extra = config.extra_items
                local bp = doPlayerAddItem(cid, 1988, 1)
                if extra ~= nil then
                    for _, v in ipairs(extra) do
                        doAddContainerItem(bp, v[1], v[2] or 1)
                    end
                end

                local weapons = config.knight_weapons
                if weapons ~= nil then
                    for _, w in ipairs(weapons) do
                        if isKnight(cid) then
                            doAddContainerItem(bp, w[1], w[2] or 1)
                        end
                    end
                end

                setPlayerStorageValue(cid, storage, 1)
            end
        end
        return true
    end
        ]]></event>
    </mod>
  6. Gostei
    nickmendes deu reputação a JhonatanCWest em Aprenda a criar e postar um NPC no seu Map   
    Olá KingTibianos
    A pedido de um membro, vou postar um tutorial de como criar um NPC. Explicando detalhadamente.
    Primeiramente, cada npc se encontra em data/npcs no seu ot.
    Vou postar aqui como exemplo um NPC que venda algumas coisas:
      <?xml version="1.0" encoding="UTF-8"?> <npc name="Paul" script="default.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="129" head="57" body="86" legs="0" feet="114" addons="2"/> <parameters> <parameter key="module_shop" value="1"/> <parameter key="shop_sellable" value="crossbow,2455,150;bow,2456,130"/> <parameter key="shop_buyable" value="crossbow,2455,360;bow,2456,200;spear,2389,10;royal spear,7378,25;assassin star,7368,200;power bolt,2547,30;bolt,2543,3;arrow,2544,2;"/> </parameters> </npc> Explicando:
    <?xml version="1.0" encoding="UTF-8"?>
    Especifica o tipo de linguagem usada no script. Não altere.
    npc name = Nome do NPC
    script = Endereço do Script. Default é o padrão.
    walkinterval = O intervalo de tempo em que o NPC anda.
    floorchange = Se ele "troca de chão", ou seja se ele se movimenta.
    healthnow = Tanto de vida que o Npc está no momento. Geralmente modificado em caso de "quests" específicas.
    max = O tanto de vida máximo dele. Este deve ser maior que o healthnow.
    looktype = Roupa usada, você pode ver as roupas no arquivo: data/XML/outfits.xml
    head, body, legs, feet = A cor da roupa, eu não tenho agora, mas vou provicenciar o pack das cores.
    addon = Se usa algum addon. 1 para o 1°, 2 para o 2°, 3 para os dois.
    <parameters> = Define que abaixo começará uma série de códigos parâmetros.
    module_shop = Módulo, usado. No caso aqui, é shop.. compras/vendas.
    shop_sellable = Define o que o NPC lhe oferece para vender.
    value = Determina as Id's, Nomes e Preços.
    crossbow,2455,150; = Primeiro "crossbow" nome que aparecerá na janela de "venda" do NPC, ID do item, Preço do Item;
    shop_buyable = Define o que o NPC irá lhe oferece para comprar
    Como colocar no RME Map Editor (Atual usado):
    1° Abra o RME, juntamente ao seu mapa.
    2° Clique em File>Import>Importar Monsters/NPC
    3° Clique no arquivo XML acima criado
    4° De um F5 para garantir o aparecimento do NPC
    5° Vá em Window e selecione Terrain Palette caso ainda não tenha feito isso.
    6° Vá em Creature, no canto esquero onde tem um option Terrain Palette.
    7° Selecione abaixo em creatures, NPCS.
    8° Clique lá embaixo, em spawns e crie uma área de circulamento do NPC no seu Mapa.
    9° Clique no nome do seu NPC, e coloque-o no mapa.
    10° Salve o Mapa! Pronto!!
    Pronto, seu NPC criado, e desenvolvido.
    Em breve o tutorial de Mapping, criando uma área para seu NPC! Bem detalhado!
    Caso tenha gostado, +REP
    Ou ao menos comente sobre o Post!
    Abraços!
  7. Gostei
    nickmendes deu reputação a Adriano SwaTT em [NPC] Bank (Igual Tibia Global)   
    Procurei aqui pelo forum, e não achei um NPC de Bank que fosse tão perfeito como este que estou postando...
    Eu mesmo havia postado há alguns dias atrás um NPC de Bank, mas não é tão bom quanto este...

    Detalhes do NPC:
    Executa as funções como do Tibia Global.
    Deposit, Transfer, Withdraw, Change Gold, Change Platinum, Change Crystal...

    Funcionando perfeitamente...
    #Testado'

    Vamos ao que interessa.

    Crie um arquivo chamado "bank.xml" na pasta "data / npc"... Cole o código abaixo dentro do arquivo:
    <?xml version="1.0" encoding="UTF-8"?> <npc name="BankMan" script="data/npc/scripts/bank.lua" walkinterval="25" floorchange="0" access="5" > <health now="150" max="150"/> <look type="132" head="115" body="0" legs="114" feet="0" addons="3" corpse="2212"/> <parameters> <parameter key="message_greet" value="Welcome |PLAYERNAME|! Here, you can {deposit}, {withdraw} or {transfer} your money from your bank account. I can change your coins too."/> <parameter key="message_alreadyfocused" value="You are drunked ? I talk with you."/> <parameter key="message_farewell" value="Goodbye. I wanna see your money... oh you again."/> </parameters> </npc> Salve e feche o arquivo.

    Agora vá na pasta Scripts e crie um arquivo chamado "bank.lua" e cole o código abaixo dentro do mesmo:
     
    local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid --------------------MESSAGES------------------------------------------------------------------------------ if msgcontains(msg, 'deposit') then selfSay('Please tell me how much gold it is you would like to deposit.', cid) talkState[talkUser] = 1 elseif msgcontains(msg, 'withdraw') then selfSay('Please tell me how much gold you would like to withdraw.', cid) talkState[talkUser] = 3 elseif msgcontains(msg, 'transfer') then selfSay('Please tell me the amount of gold coins you would like to transfer.', cid) talkState[talkUser] = 5 elseif msgcontains(msg, 'change gold') then selfSay('How many platinum coins do you want to get?', cid) talkState[talkUser] = 8 elseif msgcontains(msg, 'change platinum') then selfSay('Do you want to change your platinum coins to gold or crystal?', cid) talkState[talkUser] = 10 elseif msgcontains(msg, 'change crystal') then selfSay('How many crystal coins do you want to change to platinum?', cid) talkState[talkUser] = 15 elseif msgcontains(msg, 'balance') then n = getPlayerBalance(cid) selfSay('Your balance are '..n..' golds.', cid) talkState[talkUser] = 0 ----------------------DEPOSIT------------------------------------------------------- elseif talkState[talkUser] == 1 then if msgcontains(msg, 'all') then n = getPlayerMoney(cid) selfSay('Do you want deposit '..n..' golds ?', cid) talkState[talkUser] = 2 else n = getNumber(msg) selfSay('Do you want deposit '..n..' golds ?', cid) talkState[talkUser] = 2 end elseif talkState[talkUser] == 2 then if msgcontains(msg, 'yes') then if getPlayerMoney(cid) >= n then doPlayerDepositMoney(cid,n) selfSay('Sucessfull. Now your balance account is ' ..getPlayerBalance(cid)..' golds.', cid) talkState[talkUser] = 0 else selfSay('You don\'t have money.', cid) end else selfSay('Ok then', cid) end ----------------------WITHDRAW------------------------------------------------------------------------------------- elseif talkState[talkUser] == 3 then if msgcontains(msg, 'all') then n = getPlayerBalance(cid) selfSay('Do you want withdraw '..n..' golds ?', cid) talkState[talkUser] = 4 else n = getNumber(msg) selfSay('Do you want withdraw '..n..' golds ?', cid) talkState[talkUser] = 4 end elseif talkState[talkUser] == 4 then if msgcontains(msg, 'yes') then if getPlayerBalance(cid) >= n then doPlayerWithdrawMoney(cid, n) selfSay('Here you are, '..n..' gold. Now your balance account is ' ..getPlayerBalance(cid)..' golds.', cid) talkState[talkUser] = 0 else selfSay('There is not enough gold on your account', cid) end else selfSay('Ok then', cid) end ----------------------TRANSFER---------------------------------------------------------------------------------------- elseif talkState[talkUser] == 5 then if msgcontains(msg, 'all') then n = getPlayerBalance(cid) selfSay('Who would you like transfer '..n..' gold to?', cid) talkState[talkUser] = 6 else n = getNumber(msg) selfSay('Who would you like transfer '..n..' gold to?', cid) talkState[talkUser] = 6 end elseif talkState[talkUser] == 6 then p = msg selfSay('So you would like to transfer '..n..' gold to '..p..'?', cid) talkState[talkUser] = 7 elseif talkState[talkUser] == 7 then if msgcontains(msg, 'yes') then if getPlayerBalance(cid) >= n then if doPlayerTransferMoneyTo(cid, p, n) == TRUE then selfSay('You have transferred '..n..' gold to '..p..' and your account balance is '..getPlayerBalance(cid)..' golds.', cid) talkState[talkUser] = 0 else selfSay('This player does not exist. Please tell me a valid name!', cid) talkState[talkUser] = 0 end else selfSay('There is not enough gold on your account', cid) talkState[talkUser] = 0 end else selfSay('Ok then', cid) talkState[talkUser] = 0 end ----------------------CHANGE GOLD--------------------------------------------------------------------------------- elseif talkState[talkUser] == 8 then n = getNumber(msg) b = n * 100 selfSay('So I should change '..b..' of your gold coins to '..n..' platinum coins for you?', cid) talkState[talkUser] = 9 elseif talkState[talkUser] == 9 then if msgcontains(msg, 'yes') then if doPlayerRemoveItem(cid, 2148, b) == TRUE then doPlayerAddItem(cid, 2152, n) talkState[talkUser] = 0 else selfSay('You don\'t have money.', cid) talkState[talkUser] = 0 end else selfSay('Ok. We cancel.', cid) talkState[talkUser] = 0 end ---------------------CHANGE PLATINUM------------------------------------------------------------------------- elseif talkState[talkUser] == 10 then if msgcontains(msg, 'gold') then selfSay('How many platinum coins do you want to change to gold?', cid) talkState[talkUser] = 11 elseif msgcontains(msg, 'crystal') then selfSay('How many crystal coins do you want to get?', cid) talkState[talkUser] = 13 end elseif talkState[talkUser] == 11 then n = getNumber(msg) b = n * 100 selfSay('So I should change '..n..' of your platinum coins to '..b..' gold coins for you?', cid) talkState[talkUser] = 12 elseif talkState[talkUser] == 12 then if msgcontains(msg, 'yes') then if doPlayerRemoveItem(cid, 2152, n) == TRUE then doPlayerAddItem(cid, 2148, b) talkState[talkUser] = 0 else selfSay('You don\'t have money.', cid) talkState[talkUser] = 0 end else selfSay('Ok. We cancel.', cid) talkState[talkUser] = 0 end elseif talkState[talkUser] == 13 then n = getNumber(msg) b = n * 100 selfSay('So I should change '..b..' of your platinum coins to '..n..' crystal coins for you?', cid) talkState[talkUser] = 14 elseif talkState[talkUser] == 14 then if msgcontains(msg, 'yes') then if doPlayerRemoveItem(cid, 2152, b) == TRUE then doPlayerAddItem(cid, 2160, n) talkState[talkUser] = 0 else selfSay('You don\'t have money.', cid) talkState[talkUser] = 0 end else selfSay('Ok. We cancel.', cid) talkState[talkUser] = 0 end ---------------------CHANGE CRYSTAL------------------------------------------------------------------------------- elseif talkState[talkUser] == 15 then n = getNumber(msg) b = n * 100 selfSay('So I should change '..n..' of your crystal coins to '..b..' platinum coins for you?', cid) talkState[talkUser] = 16 elseif talkState[talkUser] == 16 then if msgcontains(msg, 'yes') then if doPlayerRemoveItem(cid, 2160, n) == TRUE then doPlayerAddItem(cid, 2152, b) talkState[talkUser] = 0 else selfSay('You don\'t have money.', cid) talkState[talkUser] = 0 end else selfSay('Ok. We cancel.', cid) talkState[talkUser] = 0 end end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) -- function maded by Gesior-- function getNumber(txt) --return number if its number and is > 0, else return 0 x = string.gsub(txt,"%a","") x = tonumber(x) if x ~= nill and x > 0 then return x else return 0 end end  
     
     

    Salve o arquivo e feche-o.

    Agora seu NPC está pronto, basta adicioná-lo ao seu mapa usando o Map Editor.
    Espero que seja de utilidade de alguém...

    Créditos: Tibiaa4e (outro forum)
    Pequeno Tuto: Adriano Swatt
     
    Testado em:
    Versões do Client: 8.54 e 8.60.
    Versões da Distro: TFS 3.4.5, TFS 0.4 e Alissow 0.4.1.

    Espero que seja útil.


    Abraços'

Informação Importante

Confirmação de Termo