Jump to content
Close

Leaderboard


Popular Content

Showing content with the highest reputation since 04/24/19 in all areas

  1. 14 points
    Yan Liima

    [System] Trade Points

    #Introdução Reparei que muitas pessoas estão atrás desse sistema que o DBOBR e NTOBR usa, e atualmente o VitorSubhi postou um, porém é necessário modificar as sources. Apesar de achar o dele bem melhor, estarei deixando este meu sistema(não é necessário mexer nas sources). #Funcionamente O jogador vai até um NPC e compra um papel, após ter comprado ele pode estar dando trade nesse papel e negociando com algum jogador em troca de qualquer item. Ao finalizar a negociação, os points são transferidos/removidos(caso houver points na conta). Também é possivel comprar o papel por comando, estarei disponibilizando ambos para vocês. #Alguns prints: Estarei deixando o script para vocês em inglês, modifique como quiser Então vamos lá... #Instalação Em data/lib crie um arquivo chamado tradepoints.lua cole isto dentro: Em data/creaturescripts/tradepoints.lua: TAG: <event type="tradeaccept" name="Trade_Points" event="script" value="tradepoints.lua"/> <event type="traderequest" name="Trade_Points_Request" event="script" value="tradepoints.lua"/> login.lua registerCreatureEvent(cid, "Trade_Points") registerCreatureEvent(cid, "Trade_Points_Request") NPC XML: <?xml version="1.0" encoding="UTF-8"?> <npc name="Frodo" script="data/npc/scripts/trade_points.lua" walkinterval="2000" floorchange="0" access="5" level="1" maglevel="1"> <health now="150" max="150"/> <look type="275" head="114" body="113" legs="113" feet="113" corpse="2212"/> <parameters> <parameter key="module_shop" value="1" /> <parameter key="message_greet" value="Hello |PLAYERNAME|. I sell some utensils and Premium Points Transfer for you to transfer points to other players, remember to buy use '10' to 10 points." /> </parameters> </npc> Data/npc/scripts/trade_points.lua: Caso queira que a compra do papel seja feita por talkactions, aqui está: Prontinho xD Agradecimentos ao @lordzetros por ajudar na função scanContainer. obs: testado em TFS 0.4
  2. 11 points
    Nolis

    Elements - Advanced Mining System

    Trago a vocês esse sistema, originalmente produzido para um servidor custom 8.60. (testado em 0.4 - firelement). Acredito que será mais útil pra vocês do que pra mim nesse momento. Se alguém puder acrescentar informações a respeito do uso em diferentes tfs agradeço. 💪 INFORMAÇÕES P = Posso mineirar vários itens nesse sistema? R = Sim, existem quatro elementos e quatro categorias, possibilitando gerar até 16 produtos finais nas minas. Essa configuração pode ser editada facilmente. Caso queira usar da maneira como o script está feito, ao mineirar você poderá coletar as seguintes pedras: P = Mas as pedras caem aleatoriamente? R = Não, esse mining possui um SKILL, conforme você mineira o skill aumenta e consecutivamente o seu LEVEL. Inicia com pedras Light, depois pure, rare e massive. Você pode editar facilmente o modo como a exp sobe, os leveis necessários para executar cada ação e as pedras. P = Qual a utilidade das pedras elementares? R = Na ideia original, projetei o sistema para que as pedras fossem gastas ao comprar itens em baús, mas fica a seu critério como utilizá-las. Por exemplo, um colar de proteção earth/ice precisaria ser pago com pedras de earth e ice. Incluirei no tópico o script utilizado no baú e o script para trocar as pedras quando atingir 100 unidades cada. Veja o exemplo: INSTALAÇÃO Em data/actions/script crie um arquivo .lua chamado elementalmining e cole o código dentro: local config = { maxmininglevel = 100, storagemining = 10000, expperlevel = 1000, experiencemining = 10001 } local stone = { blue = {8637, 8633, 9798, 1354}, green = {8640, 8636, 9791, 1353}, lightblue = {8638, 8634, 9790, 12344}, red = {8639, 8635, 9788, 1355}, } local stones = { crystal = {stone.blue[1], stone.green[1], stone.lightblue[1], stone.red[1]}, lcrystal = {stone.blue[2], stone.green[2], stone.lightblue[2], stone.red[2]}, pcrystal = {stone.blue[3], stone.green[3], stone.lightblue[3], stone.red[3]}, scrystal = {stone.blue[4], stone.green[4], stone.lightblue[4], stone.red[4]}, } local ore = { blue = {2146, 7759, 5905, 8302}, green = {2149, 7761, 12396 ,8298}, lightblue = {2150, 7762, 12575, 8303}, red = {2147, 7760, 5906, 8299}, } local ores = { ore.blue[1], ore.blue[2], ore.blue[3], ore.blue[4], ore.green[1], ore.green[2], ore.green[3], ore.green[4], ore.lightblue[1], ore.lightblue[2], ore.lightblue[3], ore.lightblue[4], ore.red[1], ore.red[2], ore.red[3], ore.red[4]} local levels = { { level = {0,19}, stone = {stones.crystal[1], stones.crystal[2], stones.crystal[3], stones.crystal[4]}, items = {ores[1],ores[5], ores[9], ores[13]}, iselect = 0, bstart = 1, gstart = 2, lbstart = 3, rstart = 4, chance = 10, -- 30 qtdmax = 1, expgainmin = 1, --15 expgainmax = 1 --50 }, { level = {20,49}, stone = {stones.crystal[1], stones.crystal[2], stones.crystal[3], stones.crystal[4], stones.lcrystal[1], stones.lcrystal[2], stones.lcrystal[3], stones.lcrystal[4]}, items = {ores[1],ores[2], ores[5], ores[6], ores[9],ores[10], ores[13], ores[14]}, iselect = 1, bstart = 1, gstart = 3, lbstart = 5, rstart = 7, chance = 10, qtdmax = 1, expgainmin = 1, expgainmax = 1 }, { level = {50,69}, stone = {stones.crystal[1], stones.crystal[2], stones.crystal[3], stones.crystal[4], stones.lcrystal[1], stones.lcrystal[2], stones.lcrystal[3], stones.lcrystal[4], stones.pcrystal[1], stones.pcrystal[2], stones.pcrystal[3], stones.pcrystal[4]}, items = {ores[1],ores[2], ores[3], ores[5], ores[6], ores[7], ores[9],ores[10], ores[11], ores[13], ores[14], ores[15]}, iselect = 2, bstart = 1, gstart = 4, lbstart = 7, rstart = 10, chance = 10, qtdmax = 1, expgainmin = 1, expgainmax = 1 }, { level = {70,89}, stone = {stones.crystal[1], stones.crystal[2], stones.crystal[3], stones.crystal[4], stones.lcrystal[1], stones.lcrystal[2], stones.lcrystal[3], stones.lcrystal[4], stones.pcrystal[1], stones.pcrystal[2], stones.pcrystal[3], stones.pcrystal[4], stones.scrystal[1], stones.scrystal[2], stones.scrystal[3], stones.scrystal[4]}, items = {ores[1],ores[2], ores[3], ores[4], ores[5], ores[6], ores[7], ores[8], ores[9],ores[10], ores[11], ores[12], ores[13], ores[14], ores[15], ores[16]}, iselect = 3, bstart = 1, gstart = 5, lbstart = 9, rstart = 13, chance = 10, qtdmax = 1, expgainmin = 1, expgainmax = 1 }, { level = {90,100}, stone = {stones.crystal[1], stones.crystal[2], stones.crystal[3], stones.crystal[4], stones.lcrystal[1], stones.lcrystal[2], stones.lcrystal[3], stones.lcrystal[4], stones.pcrystal[1], stones.pcrystal[2], stones.pcrystal[3], stones.pcrystal[4], stones.scrystal[1], stones.scrystal[2], stones.scrystal[3], stones.scrystal[4]}, items = {ores[1],ores[2], ores[3], ores[4], ores[5], ores[6], ores[7], ores[8], ores[9],ores[10], ores[11], ores[12], ores[13], ores[14], ores[15], ores[16]}, iselect = 3, bstart = 1, gstart = 5, lbstart = 9, rstart = 13, chance = 10, qtdmax = 1, expgainmin = 1, expgainmax = 1 } } function onUse(cid, item, fromPosition, itemEx, toPosition) local getMiningLevel = getPlayerStorageValue(cid, config.storagemining) local getMiningExp = getPlayerStorageValue(cid, config.experiencemining) if getMiningLevel == -1 then setPlayerStorageValue(cid, config.storagemining, 0) end if getMiningExp < 0 then setPlayerStorageValue(cid, config.experiencemining, 0) end if (isInArray(stones.crystal, itemEx.itemid) or isInArray(stones.lcrystal, itemEx.itemid) or isInArray(stones.pcrystal, itemEx.itemid) or isInArray(stones.scrystal, itemEx.itemid)) then for a = 1, #levels do min = levels[a].level[1]; max = levels[a].level[2] if (getMiningLevel >= min and getMiningLevel <= max) then if isInArray(levels[a].stone, itemEx.itemid) then if (math.random(1, 100) <= levels[a].chance) then quantity = math.random(1, levels[a].qtdmax) experience = math.random(levels[a].expgainmin, levels[a].expgainmax) if isInArray(stone.blue, itemEx.itemid) then iselection = math.random(levels[a].bstart, levels[a].bstart + levels[a].iselect) collect = levels[a].items[iselection] end if isInArray(stone.green, itemEx.itemid) then iselection = math.random(levels[a].gstart, levels[a].gstart + levels[a].iselect) collect = levels[a].items[iselection] end if isInArray(stone.lightblue, itemEx.itemid) then iselection = math.random(levels[a].lbstart, levels[a].lbstart + levels[a].iselect) collect = levels[a].items[iselection] end if isInArray(stone.red, itemEx.itemid) then iselection = math.random(levels[a].rstart, levels[a].rstart + levels[a].iselect) collect = levels[a].items[iselection] end if getMiningLevel == 100 then doSendMagicEffect(toPosition, 9) doPlayerSendTextMessage(cid, 22, text) doPlayerAddItem(cid, collect, quantity) elseif getMiningLevel <= 99 then if getMiningExp >= config.expperlevel then doSendMagicEffect(getCreaturePosition(cid), 49) setPlayerStorageValue(cid, config.storagemining, getMiningLevel + 1) setPlayerStorageValue(cid, config.experiencemining, getMiningExp - config.expperlevel) text = "You collected " ..quantity.. " matter" ..(quantity > 1 and "s" or "").. ". \n You have gained " ..experience.. " experience points in Mining. \n You advanced from mining skill level " ..getMiningLevel.. " to mining skill level " ..(getMiningLevel + 1).. "." else setPlayerStorageValue(cid, config.experiencemining, getMiningExp + experience) text = "You collected " ..quantity.. " matter" ..(quantity > 1 and "s" or "").. ". \n You have gained " ..experience.. " experience points in Mining. \n" ..(config.expperlevel - getMiningExp - experience).. " experience points left to next level. \nCurrent Mining Skill: " ..getMiningLevel.. "." end doSendMagicEffect(toPosition, 9) doPlayerSendTextMessage(cid, 22, text) doPlayerAddItem(cid, collect, quantity) end else doSendMagicEffect(toPosition, 3) doSendAnimatedText(getCreaturePosition(cid), "Working!", COLOR_WHITE) end else doPlayerSendTextMessage(cid, 22, "You need to get better in Mining to mining this.") end end end else doSendMagicEffect(getCreaturePosition(cid), 2) doPlayerSendTextMessage(cid, 22, "You can't mining this.") end end Em data/actions/actions.xml use: <!-- MINING --> <action itemid="2553" event="script" value="elementalmining.lua"/> Se tiver dúvidas a respeito de como configurar pergunte no tópico. As partes editáveis são: Local config, local Stone, local Ore, local Levels. Note que local Levels indica que algumas pedras só podeerão ser mineiradas ao ter mining level superior. Configurações das pedras: Em data/items/items.xml troque os nomes de cada pedra (os nomes ficam a seu critério ;p) <item id="2149" article="a" name="light earth substance" plural="light earth substance"> <attribute key="weight" value="1000" /> </item> <item id="2146" article="a" name="light ice substance" plural="light ice substance"> <attribute key="weight" value="1000" /> </item> <item id="2147" article="a" name="light fire substance" plural="light fire substance"> <attribute key="weight" value="1000" /> </item> <item id="2150" article="a" name="light energy substance" plural="light energy substance"> <attribute key="weight" value="1000" /> </item> <item id="7761" article="a" name="pure earth substance" plural="pure earth substance"> <attribute key="weight" value="1000" /> </item> <item id="7759" article="a" name="pure ice substance" plural="pure ice substance"> <attribute key="weight" value="1000" /> </item> <item id="7760" article="a" name="pure fire substance" plural="pure fire substance"> <attribute key="weight" value="1000" /> </item> <item id="7762" article="a" name="pure energy substance" plural="pure energy substance"> <attribute key="weight" value="1000" /> </item> <item id="12396" article="a" name="rare earth matter" plural="rare earth substance"> <attribute key="weight" value="1000" /> </item> <item id="6551" article="a" name="rare ice substance" plural="rare ice substance"> <attribute key="weight" value="1000" /> </item> <item id="6550" article="a" name="rare fire substance" plural="rare fire substance"> <attribute key="weight" value="1000" /> </item> <item id="12575" article="a" name="rare energy substance" plural="rare energy substance"> <attribute key="weight" value="1000" /> </item> <item id="8298" name="massive earth substance" plural="massive earth substance"> <attribute key="weight" value="1000" /> </item> item id="8302" name="massive ice substance" plural="massive ice substance"> <attribute key="weight" value="1000" /> </item> <item id="8303" name="massive energy substance" plural="massive energy substance"> <attribute key="weight" value="1000" /> </item> <item id="8299" name="massive fire substance" plural="massive fire substance"> <attribute key="weight" value="1000" /> </item> TRANSFORMAR PEDRAS EM MOEDAS Em data/actions/scripts/tools crie um arquivo .lua e nomeie como changecoin: local COINS = { LIGHT = { EARTH_SUBSTANCE = 2149, ICE_SUBSTANCE = 2146, ENERGY_SUBSTANCE = 2150, FIRE_SUBSTANCE = 2147 }, PURE = { EARTH_SUBSTANCE = 7761, ICE_SUBSTANCE = 7759, ENERGY_SUBSTANCE = 7762, FIRE_SUBSTANCE = 7760 }, RARE = { EARTH_SUBSTANCE = 12396, ICE_SUBSTANCE = 6551, ENERGY_SUBSTANCE = 12575, FIRE_SUBSTANCE = 6550 }, MASSIVE = { EARTH_SUBSTANCE = 8298, ICE_SUBSTANCE = 8302, ENERGY_SUBSTANCE = 8303, FIRE_SUBSTANCE = 8299 } } local TRANSFORM = { [COINS.LIGHT.EARTH_SUBSTANCE] = { TO = COINS.PURE.EARTH_SUBSTANCE }, [COINS.LIGHT.ICE_SUBSTANCE] = { TO = COINS.PURE.ICE_SUBSTANCE }, [COINS.LIGHT.ENERGY_SUBSTANCE] = { TO = COINS.PURE.ENERGY_SUBSTANCE }, [COINS.LIGHT.FIRE_SUBSTANCE] = { TO = COINS.PURE.FIRE_SUBSTANCE }, [COINS.PURE.EARTH_SUBSTANCE] = { FROM = COINS.LIGHT.EARTH_SUBSTANCE, TO = COINS.RARE.EARTH_SUBSTANCE }, [COINS.PURE.ICE_SUBSTANCE] = { FROM = COINS.LIGHT.ICE_SUBSTANCE, TO = COINS.RARE.ICE_SUBSTANCE }, [COINS.PURE.ENERGY_SUBSTANCE] = { FROM = COINS.LIGHT.ENERGY_SUBSTANCE, TO = COINS.RARE.ENERGY_SUBSTANCE }, [COINS.PURE.FIRE_SUBSTANCE] = { FROM = COINS.LIGHT.FIRE_SUBSTANCE, TO = COINS.RARE.FIRE_SUBSTANCE }, [COINS.RARE.EARTH_SUBSTANCE] = { FROM = COINS.PURE.EARTH_SUBSTANCE, TO = COINS.MASSIVE.EARTH_SUBSTANCE }, [COINS.RARE.ICE_SUBSTANCE] = { FROM = COINS.PURE.ICE_SUBSTANCE, TO = COINS.MASSIVE.ICE_SUBSTANCE }, [COINS.RARE.ENERGY_SUBSTANCE] = { FROM = COINS.PURE.ENERGY_SUBSTANCE, TO = COINS.MASSIVE.ENERGY_SUBSTANCE }, [COINS.RARE.FIRE_SUBSTANCE] = { FROM = COINS.PURE.FIRE_SUBSTANCE, TO = COINS.MASSIVE.FIRE_SUBSTANCE }, [COINS.MASSIVE.EARTH_SUBSTANCE] = { FROM = COINS.RARE.EARTH_SUBSTANCE }, [COINS.MASSIVE.ICE_SUBSTANCE] = { FROM = COINS.RARE.ICE_SUBSTANCE }, [COINS.MASSIVE.ENERGY_SUBSTANCE] = { FROM = COINS.RARE.ENERGY_SUBSTANCE }, [COINS.MASSIVE.FIRE_SUBSTANCE] = { FROM = COINS.RARE.FIRE_SUBSTANCE } } function onUse(cid, item, fromPosition, itemEx, toPosition) if(getPlayerFlagValue(cid, PLAYERFLAG_CANNOTPICKUPITEM)) then return false end local COIN = TRANSFORM[item.itemid] if(not COIN) then return false end if(COIN.TO ~= nil and item.type == ITEMCOUNT_MAX) then doChangeTypeItem(item.uid, item.type - item.type) doPlayerAddItem(cid, COIN.TO, 1) elseif(COIN.FROM ~= nil) then doChangeTypeItem(item.uid, item.type - 1) doPlayerAddItem(cid, COIN.FROM, ITEMCOUNT_MAX) end return true end Em data/actions/actions.xml acrescente: <action itemid="2149" event="script" value="tools/changecoin.lua"/> <action itemid="2146" event="script" value="tools/changecoin.lua"/> <action itemid="2150" event="script" value="tools/changecoin.lua"/> <action itemid="2147" event="script" value="tools/changecoin.lua"/> <action itemid="7761" event="script" value="tools/changecoin.lua"/> <action itemid="7759" event="script" value="tools/changecoin.lua"/> <action itemid="7762" event="script" value="tools/changecoin.lua"/> <action itemid="7760" event="script" value="tools/changecoin.lua"/> <action itemid="12396" event="script" value="tools/changecoin.lua"/> <action itemid="6551" event="script" value="tools/changecoin.lua"/> <action itemid="12575" event="script" value="tools/changecoin.lua"/> <action itemid="6550" event="script" value="tools/changecoin.lua"/> <action itemid="8298" event="script" value="tools/changecoin.lua"/> <action itemid="8302" event="script" value="tools/changecoin.lua"/> <action itemid="8303" event="script" value="tools/changecoin.lua"/> <action itemid="8299" event="script" value="tools/changecoin.lua"/> Script adicional: Bau/Chest - Comprar mesmo item com duas moedas diferentes Isso é tudo, façam bom uso!
  3. 8 points
    Huni

    World of Tibia™ - Project RPG

    Última Atualização: 20/05/2019, 18:48 BRT OBS: Esse é apenas um resumo do World of Tibia! [+] O Projeto O projeto foi iniciado á 1 mês, por enquanto só tem 1 integrante (eu) e será baseado em World of Warcraft mas não fielmente. O mundo, história, sistemas adaptado ao universo tibiano. Meu objetivo é pegar as mecânicas do Old Tibia e a dificuldade, com o visual do New Tibia e criar um novo mundo RPG. Pretendo seguir o mesmo contexto do MVP (Produto Mínimo Viável), que seria desenvolver o projeto não 100%, que seja jogável, pois quero que o servidor cresça aos poucos, e os players tenha atualizações todas semanas. A Origem dos Mundos Ninguém sabe exatamente como o universo começou. Alguns teorizam que uma explosão cósmica catastrófica espalhou as jóias do infinito nos mundos na imensidão da Grande Escuridão – mundos que um dia teriam formas de vida maravilhosas e fofas. Outros acreditam que o universo foi criado por uma única entidade todo-poderosa. Embora as origens exatas do universo caótico permaneçam incertas, está claro que uma raça de seres poderosos surgiu para trazer estabilidade a esses vários mundos e assegurar um futuro seguro para os seres que seguissem seus passos. Os titãs, deuses colossais que tinham a pele metálica, dos cantos distantes do cosmo, exploraram o universo recém nascido e se fixaram nos planos encontrados para trabalhar nele. Eles moldaram os mundos elevando imponentes montanhas e cavando vastos oceanos. Espiraram céus e criaram atmosferas. Tudo partindo de um plano, criar ordem a partir do caos. Eles deram poder a raças primitivas para cuidar e manter a integridade dos seus respectivos planos. Comandado pela elite conhecida como o Panteão, os titãs trouxeram ordem a cem milhões de mundos espalhados ao longo da Grande Escuridão do Além, durante os primeiros anos de criação. O benevolente Panteão que buscava proteger estes mundos estruturados, sempre estava vigilante contra a ameaça de ataque das entidades extra-dimensionais vis da Espiral Etérea. O Caos Inferior, uma dimensão etérea de magias caóticas que conectada a inúmeros mundos do universo, era lar de um número infinito de seres malignos que só buscavam destruir a vida e devorar as energias vivas do universo. Incapazes de conceber o mal em qualquer forma, os titãs tentaram achar um modo de terminar com a constante ameaça dos demônios. [-] Mapa O Mapa será próprio, na primeira versão do servidor, o mapa contará com 2 continentes cada continente terá 2 biomas e cada bioma terá uma cidade (o jogador poderá escolher qual cidade residir). (O mapa está nesse formato) [-] Sistema Profissão – Profissões de produção: Encatamento: Encantar Itens (dando ML, resistência, etc) Ferraria: Criar itens com ataque e armadura mais fortes Alquimia: Criar poções mais fortes (Buffs, regeneração mais alto, etc) – Profissões de coleta: Herborismo: Coletar Plantas (Alquimia) Mineração: Coletar Minérios (Ferreiro) Destruição de equipamentos: Coletar magia dos itens (Encatamento) [-] Equipe Como a primeira versão será MVP, preciso de uma Equipe dedicada (não precisa ser profissional e sim força de vontade, querer aprender , ter ideias bacana, e querer inovar sempre e ter disciplina). Sou Mapper e mexo com mapa já tem 8 anos. E nossas vagas disponíveis: Scripter Programador Designer Mapper Para se inscrever, é só me add no discord: Marcelo Weis#1024
  4. 6 points
    WooX

    DarkTheme e AutoComplete para Notepad++

    Atualização 05/05/2019: Olá a todos, acredito que muitos além de mim utilizam o Notepad++ para trabalhar com códigos, é por isso que hoje venho trazer um tema que eu mesmo fiz e um AutoComplete atualizado para o Notepad++. AutoComplete. Para quem não está familiarizado, o AutoComplete é uma função do Notepad++ que completa funções ou palavras assim que você começa digita-las. Neste AutoComplete que estou disponibilizando, possui todas as funções existentes no TFS 0.3.7 e 0.4. Para instalar o AutoComplete, primeiro você deve ativar a função no seu Notepad++. Para isso vá em Configurações -> Preferencias -> Autocompletar e deixa as configurações como mostra a seguir. Em seguida, basta colocar o arquivo lua.xml no seguinte diretório do Notepad++. Notepad++\plugins\APIs Atualização: Dark Theme. Eu fiz este tema porque detesto o tema original do Notepad++, todo aquele branco chega a arder os olhos e é muito cansativo ficar olhando pra quem programa muito tempo utilizando a ferramenta. Este tema não traz consigo somente a alteração da cor do fundo, mas um destaque de cor verde a cada função existente no AutoComplete. Um código Lua utilizando o tema, fica assim. Além disso, o tema não dá suporte apenas para a Linguagem Lua, mas também para C++, PHP, MySQL, Javascript, XML, HTML, CSS e INI. Para realizar a instalação do tema, basta ir em Configurações -> Importar -> Importar Tema(s) e escolher o arquivo DarkCode.xml. Atualização: Pronto! Após realizado todos os procedimentos, basta reiniciar seu Notepad++ que todas as alterações terão efeito. É isso, acredito que possa ser útil no dia a dia de quem desenvolve em Lua. Ultima atualização: 05/05/2019.
  5. 6 points
    Fala galera, hoje estarei ensinando como vocês podem colocar mais cores na função GameBlueNpcNameColor ali nome dos NPCS, hoje criei e separei 11 funções uma pra cada cor pra vocês usarem como quiser, *as vezes o servidor não combina só com os nomes AZUIS, que tal um ROSA? hehe. TUTORIAL SOURCE OTCLIENT Abra o arquivo const.h ache GameEnhancedAnimations = 59, em baixo cole GameRedNpcNameColor = 60, GamePinkNpcNameColor = 61, GameBabyPinkNpcNameColor = 62, GameOrangeNpcNameColor = 63, GameYellowNpcNameColor = 64, GameLightGreenNpcNameColor = 65, GameGreenNpcNameColor = 66, GameLightBlueNpcNameColor = 67, GamePurpleNpcNameColor = 68, GameBrownNpcNameColor = 69, GameBlackNpcNameColor = 70, abra o arquivo creature.cpp ache if(g_game.getFeature(Otc::GameBlueNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0x66, 0xcc, 0xff); mude para if(g_game.getFeature(Otc::GameRedNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0xff, 0x00, 0x00); if(g_game.getFeature(Otc::GamePinkNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0xff, 0x6e, 0xb4); if(g_game.getFeature(Otc::GameBabyPinkNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0xff, 0xc1, 0xc1); if(g_game.getFeature(Otc::GameOrangeNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0xff, 0x7f, 0x00); if(g_game.getFeature(Otc::GameYellowNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0xff, 0xd7, 0x00); if(g_game.getFeature(Otc::GameLightGreenNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0x7c, 0xcd, 0x7c); if(g_game.getFeature(Otc::GameGreenNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0x00, 0xcd, 0x66); if(g_game.getFeature(Otc::GameLightBlueNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0x87, 0xce, 0xff); if(g_game.getFeature(Otc::GameBlueNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0x00, 0x9a, 0xcd); if(g_game.getFeature(Otc::GamePurpleNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0xab, 0x82, 0xff); if(g_game.getFeature(Otc::GameBrownNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0xcd, 0xaa, 0x7d); if(g_game.getFeature(Otc::GameBlackNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0x82, 0x82, 0x82); Agora compile seu Otclient. USANDO AS CORES NO OTCLIENT no otclient vai em em \modules\gamelib abra o arquivo const.LUA ache GameEnhancedAnimations = 59 em baixo cole GameRedNpcNameColor = 60 GamePinkNpcNameColor = 61 GameBabyPinkNpcNameColor = 62 GameOrangeNpcNameColor = 63 GameYellowNpcNameColor = 64 GameLightGreenNpcNameColor = 65 GameGreenNpcNameColor = 66 GameLightBlueNpcNameColor = 67 GamePurpleNpcNameColor = 68 GameBrownNpcNameColor = 69 GameBlackNpcNameColor = 70 agora vá em \modules\game_things abra o arquivo things.lua ache local version = g_game.getClientVersion() em baixo coloca a cor que deseja que os npc tenha há falei rosa lá em cima né, vamos por rosa. g_game.enableFeature(GamePinkNpcNameColor) *se quiser muda o ROSA pra outra cor é só muda GamePinkNpcNameColor para uma dessa ai em baixo dentro dos () cores: GameRedNpcNameColor // Vermelho GamePinkNpcNameColor //Rosa GameBabyPinkNpcNameColor //Rosa bebe GameOrangeNpcNameColor //Laranja GameYellowNpcNameColor //Amarelo GameLightGreenNpcNameColor //Verde Claro GameGreenNpcNameColor //Verde Escuro GameLightBlueNpcNameColor //Azul Claro GamePurpleNpcNameColor //Roxo GameBrownNpcNameColor //Marrom GameBlackNpcNameColor //Preto feito isso, é só SALVAR. NPCs coloridos hehe PREVIEW ATÉ MAIS CRÉDITOS: EU
  6. 6 points
    Fala galera, por muito tempo utilizei o notepad++ para desenvolver meus códigos em lua. Agora voltando a desenvolver meu servidor, utilizo o Visual Studio Code e digo que ajuda muito em relação ao notepad++. Vantagens: 1) Você pode abrir a pasta de seu servidor, tendo uma estrutura semelhante a um projeto Java por exemplo, tudo isso de uma forma bem fácil. Se não me engano o notepad++ tem uma funcionalidade parecida, mas acredito que a maioria aqui não usa. Para fazer isso é só utilizar o atalho CTRL + K + O, ou file > Open Folder e selecionar a pasta de seu servidor. 2) Diversos atalhos. Com o VS Code, você pode utilizar atalhos, como o CTRL + P, ao fazer isso ele abre um box no topo da IDE onde o desenvolvedor pode escrever o nome do arquivo e ele encontra dentro do projeto. Fazia mais de ano que eu não abria meu servidor, então eu não lembrava de diversas coisas, como os monstros que dropavam o item 10566, então com o Visual Studio Code, eu consegui descobrir que eu não tinha configurado nenhum monstro para dropar aquele item. Para fazer essa pesquisa utilizei o atalho CTRL + SHIFT + F, onde ele pesquisa alguma palavra em específica entre os arquivos do seu projeto. E muitos outros, que você pode encontrar pesquisando pela internet. 3) Diversas extensões. Com o VS Code você pode instalar diversas extensões que auxiliam no seu desenvolvimento, por enquanto adicionei a padrão de Lua. Com ela, ao escrever códigos Lua é utilizado intellisense, facilitando muito no desenvolvimento. 4) Criação de snippets para utilização das funções do Tibia. 5) Muito mais.. Utilizo há algum tempo o VS Code para desenvolvimento de front e sempre descubro coisas novas sobre ele.. O VS Code esta disponível em: https://code.visualstudio.com/download.
  7. 5 points
    DdJs

    Magma Dungeon | Cave Hunt | 10.98

    Magma Dungeon Version: 10.98 Type: .Rar Size: 36KB Position(s): [X: 996 Y: 1015 Z: 9] File password: tibiaking Images:
  8. 5 points
    Clauis

    Markowiicz's show off

    Hello! Oi gente! Estarei postando algumas imagens de mapas meus, que foram desenvolvidos por mim para um servidor, e outros como trabalhos freelancers. Espero que gostem 😊 E ah, qualquer crítica construtiva é sempre bem-vinda. Edit.: Abram as imagens, não sei por qual motivo aparente elas ficaram borradas, WTF. Mapas de 2016.: Mapas de 2017.: Mapas de 2018/2019, sendo meus trabalhos mais recentes.: É isso pessoas, ao longo do tempo eu (quem sabe) vou atualizando esse tópico com mais imagens, beijão! ❤️
  9. 5 points
    lordzetros

    [TFS 1.3] Fly System com modal

    Introdução Estive procurando no fórum e não encontrei esse sistema de TP para versões com modal, aliás, até achei um semelhante, só que possuía algumas instabilidades e também com uma ideia de waypoints (que estava também fazendo dessa forma, mas não vem ao caso o motivo disso não ser viável no Tibia). O que trago aqui é algo mais simples, porém o necessário. O sistema de TP é muito importante em alguns servidores que fogem um pouco de RPG (não que seja exclusivamente para estes), ele possibilita viagens de um local para outro em instantes, como por exemplo, do Templo para o Depot ou para qualquer outra localização configurada no script (a seu gosto). Uma coisa adicional que coloquei no script, foi de listar também a house do jogador que utilizar o comando, onde você poderá configurar se será necessário pagar ou não para o mesmo ser teleportado, enfim, dê uma olhada no código depois, tá tudo comentado. Informações do sistema - Locais configuráveis - Configurável se é necessário pagar ou não para determinado local - Configurável a quantidade de dinheiro de cada local - Condições ao utilizar o comando (Protect Zone e tempo para utilizar o comando novamente) - É requisitado o jogador está possuindo a quantia necessária para o teleport Instalação 1 - crie um arquivo chamado teleportSystem.lua em data/talkactions/scripts/ e cole o código abaixo: 2 - Em seguida, cole este trecho de código em data/talkactions/talkactions.xml abaixo de algum semelhante: 3 - Agora crie um arquivo chamado modalTpSystem.lua em data/creaturescripts/scripts/ e cole o código abaixo nele: 4 - E para finalizar, cole este código em data/creaturescripts/creaturescripts.xml abaixo de um semelhante: Explicação do script A única coisa que você vai mexer é no teleportSystem, onde terá a opção de configurar os preços, locais, etc. Configurando as houses: houses_modal = Se será habilitado o player teleportar para a house dele house_pago = Se será pago o teleport para a house house_custo = Custo do teleport para a house, caso seja pago Configurando o local: nome = Nome do local a ser mostrado na janela pago = Se ele vai ser pago ou não, coloque false caso queira que não cobre nada do jogador custo = Caso tenha colocado como pago, o custo do teleport para o local pos = Posição do local (X,Y,Z) Quando for adicionar outro, copie esta mesma parte acima e altera o número [3] para [4] e os outros dados também, assim por diante. O restante também tá explicado no script, basta ler. Demonstração UTILIZE O COMANDO !fly Enfim, script simples, tem para outras versões, mas como falei, não tinha encontrado ainda para 1.x com esse funcionamento. Qualquer coisa, só comentar, .
  10. 5 points
    BOM GALERA PRETENDO MANTER ATUALIZAÇÕES DESTA PAGINA SEMANALMENTE. BASICAMENTE ESTE É MEU SERVIDOR QUE EDITO QUANDO NÃO TENHO NADA PARA FAZER : / ESPERO QUE GOSTEM RSRS Lembrando que somente irei mostrar as modificações que eu fizer no OTCLIENTE 😅 SISTEMA DE CAPTURA sem criticas ofensivas por favor!! Ocultar conteúdo Sistema de addons Ocultar conteúdo sistema de Loja Ocultar conteúdo Sistema de casino 50% Ocultar conteúdo Tutorial em Jogo Ocultar conteúdo Sistema de Pokémons iniciais Ocultar conteúdo Sistema de boost Stone Ocultar conteúdo Sistema de Teleport Ocultar conteúdo É ISSO ESPERO QUE TENHAM GOSTADO RSRS FACEBOOK: https://www.facebook.com/PokeZRingOnline YOUTUBE: https://www.youtube.com/channel/UCgJHPztxiFFpWGUI9ty3xJA DISCORD: https://discord.gg/5rWrD4k
  11. 5 points
    REV3884 TFS 0.4 OTC 0.6.6 OBSERVAÇÃO: Bom galera hoje vim trazer um código de expansão de visão para o otclient alterado por mim, usado somente para rev3884 e então se você usa um tfs 0.3.6 ou tfs 1.0 não vai dar certo, *Esse código foi alterado por mim para ser usado apenas para rev3884, procolo 8.60 e TFS 0.4 que no caso não achei e resolvi compartilhar essas alterações. 1° TUTORIAL 1 SOURCE DO SEU SERVIDOR. Abra Protocollgame.cpp 1 Ache ((x >= myPos.x - 8 + offsetz) && (x <= myPos.x + 9 + offsetz) && //(y >= myPos.y - 6 + offsetz) && (y <= myPos.y + 7 + offsetz)); ALTERE PARA: ((x >= myPos.x - Map::maxClientViewportX + offsetz) && (x <= myPos.x + (Map::maxClientViewportX+1) + offsetz) && (y >= myPos.y - Map::maxClientViewportY + offsetz) && (y <= myPos.y + (Map::maxClientViewportY+1) + offsetz)); 2 Ache: GetMapDescription(pos.x - 8, pos.y - 6, pos.z, 18, 14, msg); ALTERE PARA: GetMapDescription(pos.x - Map::maxClientViewportX, pos.y - Map::maxClientViewportY, pos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, msg); 3 Ache: if(oldPos.y > newPos.y) // north, for old x { msg->put<char>(0x65); GetMapDescription(oldPos.x - 8, newPos.y - 6, newPos.z, 18, 1, msg); } else if(oldPos.y < newPos.y) // south, for old x { msg->put<char>(0x67); GetMapDescription(oldPos.x - 8, newPos.y + 7, newPos.z, 18, 1, msg); } if(oldPos.x < newPos.x) // east, [with new y] { msg->put<char>(0x66); GetMapDescription(newPos.x + 9, newPos.y - 6, newPos.z, 1, 14, msg); } else if(oldPos.x > newPos.x) // west, [with new y] { msg->put<char>(0x68); GetMapDescription(newPos.x - 8, newPos.y - 6, newPos.z, 1, 14, msg); } ALTERE PARA: if (oldPos.y > newPos.y) { // north, for old x msg->put<char>(0x65); GetMapDescription(oldPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } else if (oldPos.y < newPos.y) { // south, for old x msg->put<char>(0x67); GetMapDescription(oldPos.x - Map::maxClientViewportX, newPos.y + (Map::maxClientViewportY+1), newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } if (oldPos.x < newPos.x) { // east, [with new y] msg->put<char>(0x66); GetMapDescription(newPos.x + (Map::maxClientViewportX+1), newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); } else if (oldPos.x > newPos.x) { // west, [with new y] msg->put<char>(0x68); GetMapDescription(newPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); } 4 ache GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 5, 18, 14, 3, skip); //(floor 7 and 6 already set) GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 4, 18, 14, 4, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 3, 18, 14, 5, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 2, 18, 14, 6, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 1, 18, 14, 7, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 0, 18, 14, 8, skip); Altere para GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 5, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); //(floor 7 and 6 already set) GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 4, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 4, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 5, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 6, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 1, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 7, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 0, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 8, skip); 5 ache GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, oldPos.z - 3, 18, 14, 3, skip); ALTERE PARA GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, oldPos.z - 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); 6 ACHE GetMapDescription(oldPos.x - 8, oldPos.y + 1 - 6, newPos.z, 1, 14, msg); ALTERE PARA GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - (Map::maxClientViewportY-1), newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); 7 ACHE GetMapDescription(oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 1, msg); ALTERE PARA GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); 8 Ache GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 14, -1, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 1, 18, 14, -2, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip); Altere para GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -1, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 1, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -2, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip); 9 ache GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip); Altere para GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip); 10 ache GetMapDescription(oldPos.x + 9, oldPos.y - 1 - 6, newPos.z, 1, 14, msg); Altere para GetMapDescription(oldPos.x + Map::maxClientViewportX+1, oldPos.y - (Map::maxClientViewportY+1), newPos.z, 1, ((Map::maxClientViewportY+1)*2), msg); AGORA EM MAP.H ache static const int32_t maxViewportX = 11; //min value: maxClientViewportX + 1 static const int32_t maxViewportY = 11; //min value: maxClientViewportY + 1 static const int32_t maxClientViewportX = 8; static const int32_t maxClientViewportY = 6; altere para: static const int32_t maxViewportX = 18; //min value: maxClientViewportX + 1 static const int32_t maxViewportY = 18; //min value: maxClientViewportY + 1 static const int32_t maxClientViewportX = 14; static const int32_t maxClientViewportY = 12; Pronto agora é só compilar a source do seu servidor 8.60 rev3884 PARTE 2 OTCLIENT 0.6.6 abra o map.cpp da source do otclient ache void Map::resetAwareRange() { AwareRange range; range.left = 8; range.top = 6; range.bottom = 7; range.right = 9; setAwareRange(range); } ALTERE PARA void Map::resetAwareRange() { AwareRange range; range.left = 14; //Change this to = maxClientViewportX range.top = 12; //Change this to = maxClientViewportY range.bottom = range.top+1; range.right = range.left+1; setAwareRange(range); } COMPILE A SOURCE DO OTCLIENT E PRONTO!!! ESPERO TER SANADO VÁRIAS DÚVIDAS DE AUMENTAR TELA DO OTCLIENT EM REV3884. CRÉDITOS: Pra mim pela alterações funcionais. e pelo Flatlander por disponibilizar para tfs 0.3.6 e 1.0 pois esse está alterado pra tfs 0.4
  12. 5 points
    Feito por: @Storm (testado em tfs 0.4 - firelement, funciona em 0.3) Quem jogou rozinx server provavelmente conheceu a febre do sistema de weapons por points e consecutivamente o sistema Aegis. Pra quem não conhece, no rozinx haviam vários baús e você podia comprar os itens usando pontos. Esses pontos eram obtidos donatando (por volta de 2007-2015), porém na nova geração (2018) foi introduzido o sistema Aegis, um monstro que após você matá-lo 3 vezes recebia 1 ponto vip, e podia então coletar esses pontos para obter as armas pagas de forma gratuita. Trago a vocês uma versão diferente do Aegis. O Star system. Gratidão ao @Storm por criar o script e refazê-lo quase um ano depois, após não reconhecer o próprio script 😂 Vc é fera! 💪 Como funciona: O star system funciona em conjunto com o Advanced Minin System (elements) (se você preferir), diferente do servidor Rozinx, que entrega pontos vip, o Star system entrega 1 dos 4 massive element substance aleatoriamente (as pedras mais raras e difíceis de obter no mining: Earth, Ice, Fire ou Energy) após você matar 3 estrelas. INSTALAÇÃO -- Código para entregar item após matar o monstro data/creaturescripts/scripts/star.lua: local config = { monster = { name = "star", count = 3, storage = 6665, storage2 = 7775 }, premio = {{8298, 1}, {8302, 1}, {8299, 1}, {8303, 1}} -- {item_id, count} } function onDeath(cid, corpse, deathList) local killer = deathList[1] local pos = getCreaturePosition(killer) if not isMonster(cid) or not isPlayer(killer) then return true end if getPlayerStorageValue(killer, config.monster.storage) == -1 then setPlayerStorageValue(killer, config.monster.storage, 0) end setPlayerStorageValue(killer, config.monster.storage, getPlayerStorageValue(killer, config.monster.storage) + 1) if getPlayerStorageValue(killer, config.monster.storage) == config.monster.count then doSendMagicEffect(pos, CONST_ME_MAGIC_BLUE) local item = config.premio[math.random(1, #config.premio)] doPlayerAddItem(killer, item[1], item[2]) if getPlayerStorageValue(killer, config.monster.storage2) == -1 then setPlayerStorageValue(killer, config.monster.storage2, 0) end setPlayerStorageValue(killer, config.monster.storage2, getPlayerStorageValue(killer, config.monster.storage2) + 1) setPlayerStorageValue(killer, config.monster.storage, 0) doPlayerSendTextMessage(killer, MESSAGE_STATUS_CONSOLE_RED, "You receive ".. item[2] .." ".. getItemNameById(item[1]) .." by kill ".. config.monster.count .."x the monster ".. config.monster.name ..".") return true else doPlayerSendTextMessage(killer, MESSAGE_STATUS_CONSOLE_BLUE, "You killed ".. getPlayerStorageValue(killer, config.monster.storage) .." of ".. config.monster.count .." ".. config.monster.name ..", There are still ".. config.monster.count - (getPlayerStorageValue(killer, config.monster.storage)) .." ".. config.monster.name .." left to receive the reward.") return true end return true end data/creaturescripts/creaturescripts.xml: <!-- star system --> <event type="death" name="Star" event="script" value="star.lua"/> -- Código para checar monstros abatidos e recompensas obtidas data/talkactions/scripts/starcheck.lua: local config = { name = "star", count = 3, storage2 = 7775 } function onSay(cid, words, param, channel) doPlayerPopupFYI(cid, "--- ".. config.name .." Status ---\n\nKills = ".. config.count * getPlayerStorageValue(cid, config.storage2) .."\nRewards = ".. getPlayerStorageValue(cid, config.storage2) ..".") return true end data/talkactions/talkactions.xml: <talkaction log="yes" words="!starcheck" event="script" value="starcheck.lua" /> -- Código do monstro data/monster/star.lua: <?xml version="1.0" encoding="UTF-8"?> <monster name="Star" nameDescription="a star" race="blood" experience="10000" speed="500" manacost="200"> <health now="15000000" max="15000000"/> <look type="294" corpse="6324"/> <targetchange interval="2000" chance="0"/> <strategy attack="100" defense="0"/> <flags> <flag summonable="0"/> <flag attackable="1"/> <flag hostile="1"/> <flag illusionable="0"/> <flag convinceable="0"/> <flag pushable="0"/> <flag canpushitems="1"/> <flag canpushcreatures="1"/> <flag targetdistance="1"/> <flag staticattack="1"/> <flag runonhealth="0"/> </flags> <attacks> <attack name="melee" interval="2000" skill="1000" attack="1000"/> <attack name="holy" interval="1500" chance="1000" range="6" radius="7" target="0" min="-100" max="-500"> <attribute key="areaEffect" value="holydamage"/> </attack> <attack name="outfit" interval="150" chance="10000" range="6" monster="star" duration="1000"> <attribute key="areaEffect" value="holydamage"/> </attack> <attack name="energy" interval="2000" chance="1000" range="6" radius="6" target="0" min="-200" max="-300"> <attribute key="areaEffect" value="purpleenergy"/> </attack> <attack name="fire" interval="2000" chance="1000" range="6" radius="5" target="0" min="-100" max="-500"> <attribute key="areaEffect" value="holydamage"/> </attack> <attack name="physical" interval="2000" chance="1000" range="6" radius="4" target="0" min="-200" max="-300"> <attribute key="areaEffect" value="groundshaker"/> </attack> <attack name="death" interval="3000" chance="1000" range="6" radius="3" target="0" min="-200" max="-700"> <attribute key="areaEffect" value="holyarea"/> </attack> </attacks> <elements> <element energyPercent="20"/> <element holyPercent="40"/> <element icePercent="-40"/> <element firePercent="30"/> </elements> <script> <event name="Star"/> </script> <script> <event name="noattack"/> </script> </monster> data/monster/monster.xml: <monster name="star" file="star.xml"/> -- Código para os monstros não se matarem com as magias data/creaturescripts/scripts/noattack.lua: function onStatsChange(cid, attacker, type, combat, value) -- This should block all damage monster cause on eachother expect player summons if isMonster(cid) and isMonster(attacker) then local master = getCreatureMaster(cid) if not master or not isPlayer(master) then return false end end return true end data/creaturescripts/creaturescripts.xml: <event type="statschange" name="noattack" event="script" value="noattack.lua"/>
  13. 4 points
    Salve salve galera do TK! Hoje vos trago o Wodbo Wars versão 5.9(de 2016) Creio que muitos daqui que joga dbo deve conhecer esse servidor, atualmente ele está online! Pra quem não sabe eu já fui da equipe, ajudei a dar inicio ao projeto, corrigindo bugs, scripts,mexendo com site,db etc... Por conta de mesquice do Arkam, ele me tirou da equipe e ai rolou treta entre eu e ele. Muitos já devem saber a história. Enfim... Decidi trazer para vocês pois faz muito tempo que a galera vive enchendo o saco para mim postar. E como esse servidor não tem nenhum valor para mim, só guardava e não postava por respeito ao Matheus P.(Arkam), mesmo tendo nossas intrigas, ele é um grande rapaz. Decidi postar, já que o mesmo não liga mais! Imagens: Bom, não estarei postando a distro original, estarei deixando a que ele utilizou no inicio. Recomendo vocês baixarem alguma src(source) e compilarem. Recomendo utilizar a do @Fir3element. No site dele oficial tem um bug de gerar várias vezes a RK, concertei isso para vocês. Assim podendo gerar apenas uma vez! A base utilizado nesse servidor foi o Dbo Hunter(criado pelo Renan), esse servidor tem umas gambiarras, mas creio que irá ajudar muitas pessoas que não tem muita experiência de começar do 0. Utilizem como base, sejam criativos e entre pra concorrência DOWNLOAD: Créditos: Matheus Pacheco(Arkam or Arkamed) Yan Liima(Night) As vezes certas pessoas se aproveita de outras para poder chegar longe. ;( Façam um bom aproveito, abraços!
  14. 4 points
    Bom galera como o própio titulo já diz... colocando limite no ctrl- no otclient 0.6.6 pra não ficar vendo todo o mapa. vá em modules\game_interface Ache: limitedZoom = false Altere para limitedZoom = true Ache gameMapPanel:setMaxZoomOut(513) altere para gameMapPanel:setMaxZoomOut(15) fácil né?? espero ter ajudado alguém
  15. 4 points
    Acesse: classicyurots.com ⚔ Classic Yurots ☠ versão: 8.60 ejam todos bem vindos! É com grande satisfação que anunciamos a data oficial da abertura do Classic Yurots: 04/05/2019 às 15:00h! Nosso objetivo é trazer uma jogabilidade 100% com sistemas exclusivos, um servidor balanceado e muitas novidades. Testamos todas as vocações e magias ao máximo para um ótimo balanceamento no PVP. Esperamos por você para jogar o servidor e fazer parte dele desde o seu início. Em caso de dúvidas, bugs ou sugestões, utilize nosso discord. Também poderá abrir um ticket. Veja as configurações do servidor clicando aqui. Roshamuul Gosta de correr em roshamuul e curte jogar um servidor 8.60? No Classic Yurots você pode fazer os dois. Também foi adicionado uma missão em roshamuul para dar acesso rápido ao upper em roshamuul. Roshamuul é uma área totalmente FREE! World Bosses World Bosses são chefes de eventos especiais encontrados apenas na sala World Boss. Este evento é exclusivo do servidor e ocorre apenas 1x na semana. World Boss faz parte do UnderWorld e é neste evento que você poderá farmar o melhor set atual do servidor (esse set só está disponível In-Game). Para mais informações sobre World Bosses, clique aqui. Futuramente haverá outros meios de farmar o melhor set do servidor. Atualizações Customs No Classic Yurots, foram feitas algumas modificações e adições de fórmulas e itens. O objetivo é melhorar a experiência dos jogadores e fazê-los lembrar um pouco dos tempos de ouro. Algumas modificações foram implementadas apenas para determinada classe, afim de balancear o PVP. ➤ Ultimate Healing Rune = Fórmula da versão 7.6. (Esta fórmula funciona apenas para knights. Demais vocações, a fórmula continua da versão 8.6). ➤ Enchanted Staff = Ao utilizar a magia 'Exeta Vis' segurando uma 'Staff', transformará o item em uma wand, 'Enchanted Staff'. (Mages podem utilizar esta magia, a wand possui dano de energy: 65~90 - Duração: 10 minutos). ➤ Animate Dead Rune = Ao utilizar em um corpse, sumona um 'Animated Skeleton'. (Esses monstros causam um dano muito alto de death porém, são muito frágeis). ➤ Staff Of Destruction = Esse item pode ser obtido após finalizar a 'Pits of Inferno Quest'. (Wand apenas para mages com dano de energy: 90~140). ➤ Diamond Arrows = Todos os Paladins podem conjurar 100 deste item utilizando a magia 'exevo gran con hur'. (Requer level: 150, mana: 1000, o item dura 10 minutos - ATK: 37, HitChance: 91, ataca uma área de 21 SQM's com atk físico). ➤ Crystalline Arrows = Você poderá obter este item em troca de um 'Soul Orb' no npc 'A Sweaty Cyclops'. (Atk: 65, HitChance: 85). ➤ Infernal Bolts = Você poderá obter este item em troca de um 'Soul Orb' no npc 'A Sweaty Cyclops'. (Atk: 72, HitChance: 75). ➤ Great Holy Rune = Uma runa apenas para paladins, causa dano de Holy em uma área de 37 SQM's. (Possui um dano um pouco inferior que uma gfb. Apenas paladins podem usar). Quests O Classic Yurots possui mais de 20 quests, muitas delas são exclusivas, com puzzle e seus bosses possuem mecânicas, para a diversão dos jogadores. Quests disponíveis atualmente no servidor: ✔ Quest 100k - No mesmo estilo da Desert Quest ✔ Pits Of Inferno Quest - 100% igual global (com algumas modificações para facilitar). ✔ Firewalker Boots Quest ✔ Demon Helmet Quest ✔ Promotion Quest - Custom ✔ Dwarven Legs Quest - Custom ✔ Inquisition Quest - 100% igual global (com algumas modificações para facilitar). ✔ Demon Oak Quest - 100% igual global (é necessário finalizar a task especial dos 6666 demons no npc 'Grizzly Adams' ou comprar o hallowed axe de outro jogador). ✔ AURA Quest - Custom ✔ Yalahari Quest - 100% igual global (com algumas modificações para facilitar). ✔ WOTE Quest - 100% igual global (apenas a parte final - O Boss). ✔ Canivete Quest - Custom ✔ Ring Quest - Custom ✔ Weapon Quest - Custom ✔ Golden Helmet Quest - Custom ✔ Shield Quest - Custom ✔ Classic Set Quest - Custom ✔ Classic Helmet Quest - Custom ✔ Classic Boots Quest - Custom ✔ Classic Weapon Quest - Custom (atualmente, as melhores armas do servidor). ✔ Blessed Shield Quest - SECRET Futuramente haverá atualizações para implementação de novas quests, garantindo assim a diversão de todos os jogadores e não deixando o servidor na mesmice. Existem várias quests escondidas que não foram citadas aqui ou na lista de quests, na página characters. Sobre o administrador e o servidor: Meu nome é Weslley Santos, tenho 25 anos e cursei Sistema de Informação. Jogo tibia desde sua melhor época (7.4), para mim, uma das melhores versões. Estou muito ansioso pois foram quase 3 anos de trabalho duro para chegar até aqui. Deixei de lado esse hobby e coloquei como objetivo, me dedicando para tentar trazer o melhor para vocês. Cada sistema do servidor foi testado de todas as maneiras possíveis, assim garantindo a máxima diversão para vocês jogadores. Estou muito feliz em ver que finalmente cheguei ao FIM deste projeto e posso por ele online. Estou muito animado para o futuro deste servidor e sei que fiz algo incrível. Estou sempre buscando inovar, pegar ideias boas e melhorá-las para que o servidor sempre tenha novidades. O servidor possui sistemas únicos que eu mesmo desenvolvi, castle totalmente exclusivo e muito mais... Para visualizar todos os membros da staff, clique aqui. Sistemas exclusivos: ✔ NPC Boss Seller - Para mais informações, clique aqui. ✔ Daily Quest - Para mais informações, clique aqui. ✔ Blood Castle - Para mais informações, clique aqui. ✔ Caça ao Tesouro - Para mais informações, clique aqui. ✔ The Rain - Para mais informações, clique aqui. ✔ Counter Strike - Para mais informações, clique aqui. ✔ World Bosses - Para mais informações, clique aqui. ✔ Cave Exclusiva - Para mais informações, clique aqui. ✔ Cooking/Receitas - Para mais informações, clique aqui. ✔ Weapon Elements - Para mais informações, clique aqui. ✔ Aura System - Para mais informações, clique aqui. ✔ Avançar Casts utilizando CTRL + SETAS. E muitos outros... Eventos: ✔ Daily Quest ✔ Defend The Tower ✔ SnowBall War ✔ Bomberman ✔ Zombie Event ✔ Monster Hunter ✔ Blood Castle ✔ Caça ao Tesouro ✔ The Rain ✔ Counter Strike Battle Outros eventos poderão ser adicionados no futuro... Para sua guild: ✔ Guild Shop - Para visualizar o GuildShop, clique aqui. ✔ War Anti-Entrosa - Para mais informações, clique aqui. ✔ War Castle A página da guild foi modificada para uma melhor visualização. Nosso servidor possui alguns comandos para melhorar a comunicação e o PVP. Outros sistemas para as guilds poderão ser adicionados no futuro...
  16. 4 points
    KR3

    Layout NTO WAR LEGENDS [NEW ATT]

    Fala guys, vim trazer [+] um layout para vocês que estão iniciando um projeto de narutibia, eu já postei outros aqui no forum, nto brasil, e nto ultimate 2017 esse ainda é o do ultimate mas a rapazeada do war legends editou um pouquinho mais colocou apenas um slider mas resolvi atualizar, aqui. para vocês. creditos: Nto War Legend Então é isso até mais fassa bom uso. PRINTS LAYOUT SCAN
  17. 4 points
    Gengo

    [OTClient] Player Info OTPokemon

    [OTClient] Health Player Info OTPokemon Eae galerinha do TibiaKing, hoje venho trazer mais uma contribuição para a comunidade, um módulo indêntico ao do OtPokemon. Mesmo que seja simples a instalação, tem sempre aquele que não sabe onde deve colocar o módulo, peço então que tenha paciência quanto a esse simples tutorial, aos demais aqueles que já sabem, peço que ao menos leia a Observações do módulo. 1º Faça o download do módulo. 2º Extraia o módulo para a pasta do seu otClient em /modules ficando assim: Feito o passo 1 e 2 creio que já estará funcionando, isto se você fez tudo certinho. •Observações do módulo• Demonstrativo do módulo no jogo.
  18. 3 points
    Nolis

    Daniel Mapping

    Nova Yurot 2019 O remake pt. 5
  19. 3 points
    DdJs

    Earth & Water Elemental's Caves | 8.60

    Earth & Water Elemental's Caves Version: 8.60 Download: Type: .Rar Size: 1.86MB Position(s): [X: 1024 Y: 1030 Z: 9] File password: tibiaking Scan: Images:
  20. 3 points
    Primeiramente, tente sempre deixar claro qual a versão da sua distro nos seus tópicos. Espero que a versão que chutei ser a do seu servidor seja a correta. Não estava em casa, então não tive como testar exatamente nada, qualquer problema é só falar. Em data/lib crie um arquivo.lua e cole isto dentro: Os campos que têm tempo você pode configurá-los como quiser. Os valores possíveis seguem os exemplos abaixo: Ex.: {40, "sec"}, {10, "min"}, {2, "hour"}, {1, "day"} Em data/talkactions/scripts crie um arquivo.lua e cole isto dentro: No talkactions.xml, adicione a tag: <talkaction words="!pvp" event="script" value="NOMEDOSEUARQUIVO.lua"/> Em data/creaturescripts/scripts crie um arquivo.lua e cole isto dentro: No creaturescripts.xml, adicione as linhas: <event type="target" name="PvpSysTarget" event="script" value="NOMEDOSEUARQUIVO.lua"/> <event type="combat" name="PvpSysCombat" event="script" value="NOMEDOSEUARQUIVO.lua"/> <event type="login" name="PvpSysLogin" event="script" value="NOMEDOSEUARQUIVO.lua"/> <event type="look" name="PvpSysLook" event="script" value="NOMEDOSEUARQUIVO.lua"/> <event type="kill" name="PvpSysKill" event="script" value="NOMEDOSEUARQUIVO.lua"/> Deixe o servidor como pvp no config.lua. Os comandos para ativar e desativar o pvp são, respectivamente, !pvp on e !pvp off
  21. 3 points
    DdJs

    Merchant Island | 8.60

    Merchant Island Version: 8.60 Type: .Rar Size: 55KB Position(s): [X: 1074 Y: 1011 Z: 7] File password: tibiaking Images:
  22. 3 points
    Storm

    ANSWERED !akatsuki

    @REI DAVID local storage = 43455 local t = { [1] = {lookType = 203}, -- [vocation ID] = {lookType = outfit id} [2] = {lookType = 204}, } function onSay(cid, words, param, channel) if getPlayerStorageValue(cid, storage) == 1 then local outfit = t[getPlayerVocation(cid)] if outfit then if outfit ~= getCreatureOutfit(cid).lookType then doChangeCreatureOutfit(cid, outfit) db.executeQuery("UPDATE `players` SET `looktype`=".. outfit .." WHERE `players`.`id`= ".. getPlayerGUID(cid) .."") doSendMagicEffect(pos, 10) doCreatureSay(cid, "AKATSUKI!!", TALKTYPE_MONSTER) return true else doPlayerSendTextMessage(cid, 27, "Voce ja esta transformado!") doSendMagicEffect(pos, 4) return true end else doPlayerSendTextMessage(cid, 27, "Sua vocacao nao se transformar em akatsuki") doSendMagicEffect(pos, 4) return true end else doPlayerSendTextMessage(cid, 27, "Voce nao tem a storage") doSendMagicEffect(pos, 4) return true end return true end
  23. 3 points
    DdJs

    [TFS 0.4] Bow Mágico

    Faz um tempo que eu postei algo aqui nessa parte do fórum sobre uma wand elemental a pedido de um membro. Quando fiz o post, uns dias depois alguém veio no meu inbox perguntando se eu tinha algo parecido relacionado a bow e acabou que eu apaguei as mensagens e não me recordo o nome da pessoa para poder marca-la aqui, e também só agora me lembrei disso e resolvi vir aqui postar. Eu não tenho conhecimento nenhum disso, muito menos sobre cálculos de formulas ou se existe outro mais sofisticado. Se alguém que entende do assunto quiser fazer melhorias, correções, etc, sinta-se a vontade. Introdução: Para quem já jogou o foxworld open tibia, ou algum outro otserver baiak/custom já deve ter visto um "magic bow" lá entre os itens vips/donates que dispara sozinho arrows, sem precisar das arrows em seu devido slot. Pois bem, isso é um negocinho bem simples que serve para leigos que nem eu no assunto colocar no ot uma arminha diferente. O ponto disso é que não tem nenhum segredo na "criação", você só altera um bow para ele funcionar como uma viper star. Mas de tudo é bem interessante e permite que o paladin tenha o 'slot extra' vago para usar de outra forma. Guia: Vamos lá! O bow que eu vou usar vai ser o Elethriel's Elemental Bow (ID: 8858) . É um bow interessante para se usar, ele tem um sprite bonito e não pode-se obter no jogo (o que facilita bastante). Os tiros eu usei as Shiver Arrows que combina com a cor do bow e possibilita colocar o elemento de envenenamento do alvo de gelo. Você pode usar o bow que quiser e alterar para o tipo de tiro que achar melhor. Veja dicas no final do tutorial. Em items.xml de CTRL F, coloque 8858 e vá até o Elethriel's Bow e deixe da seguinte forma: O attack, range e nome você poe a seu gosto. Em weapons.xml de CTRL F, coloque 8858 e vá até o Elethriel's Bow e deixe da seguinte forma: O level você poe a seu gosto. Em weapons/scripts crie um arquivo magicbow.lua e coloque isso dentro: Guia: setCombatParam(xCombat, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) Tipo de dano que causará no alvo (você pode alterar para fogo, terra, etc). local condition = createConditionObject(CONDITION_FREEZING) Tipo de efeito que ficará no alvo (você pode alterar para fogo, terra, etc). addDamageCondition(condition, 100, 2000, -20) O alvo vai sofrer com o dano de 20 hit points a cada 2000 milissegundos, você pode notar outras duas linhas como essa de 10 e 5, os danos vão abaixando gradativamente, de 20 passa para 10 a cada 1000 milissegundos e 5 a cada 1000 milissegundos. Tipos de conditions, shottypes e como calcular formulas você pode encontrar variados tutoriais e aulas aqui no fórum mesmo. Isso é tudo, pessoal. Depois desses três passinhos simples, estará tudo pronto! Dicas: Ideias úteis: Funcionamento:
  24. 3 points
    Reds

    C++ Efeito no critico

    Boa tarde, há algum tempo não posto scripts por falta de sugestão, porém hoje navegando encontrei um pedido muito antigo que não foi fechado, talvez o criador do tópico já concluiu, mas vou disponibilizar para outras pessoas que queiram o código. O tópico era: No tfs 0.4 rev 3884 tem a mesma configuração para envio de critico, então para iniciar, você deve ir até o arquivo weapons.cpp e colocar abaixo de: player->sendCritical(); o seguinte: target->sendCritical(); Em creature.cpp adicione no final do arquivo o seguinte: void Creature::sendCritical() const { if(g_config.getBool(ConfigManager::DISPLAY_CRITICAL_HIT)) g_game.addMagicEffect(getPosition(), MAGIC_EFFECT_MIRRORVERTICAL); } E em creature.h adicione na linha abaixo de: void setLossSkill(bool _skillLoss) {skillLoss = _skillLoss;} o código: void sendCritical() const; Depois só compilar e testar. Imagem mostrando o resultado (apenas alterei o magicEffect): Edit1: notei que foi publicado em Aulas de Scripting ao invés de "Códigos", porém ao editar o tópico não posso mover para outro lugar.
  25. 3 points
    @victor4312 local config = { name = "Demon", -- Nome do Summon max = 1, -- Máximo de summons storage = 42355, -- Storage que permite o uso exaust_sto = 5555, -- Storage que contabiliza o exaust exaust_time = 60 -- Segundos de Exaust } function onUse(cid, item, fromPosition, itemEx, toPosition) local pos = getCreaturePosition(cid) if getPlayerStorageValue(cid, config.storage) == 1 then if not exhaustion.check(cid, config.exaust_sto) then if table.maxn(getCreatureSummons(cid)) <= config.max then local target = doCreateMonster(config.name, pos) doConvinceCreature(cid, target) doPlayerSendTextMessage(cid, 27, "Voce invocou o monstro ".. config.name .."!!") doSendMagicEffect(pos, CONST_ME_TELEPORT) exhaustion.set(cid, config.exaust_sto, config.exaust_time) return true else doPlayerSendTextMessage(cid, 27, "Você ja tem a quantidade máxima de summons ativos!") doSendMagicEffect(pos, POFF) return false end else doPlayerSendTextMessage(cid, 27, "Exhaustion!! Wait ".. exhaustion.get(cid, config.exaust_sto) .." seconds.") doSendMagicEffect(pos, POFF) return false end else doPlayerSendTextMessage(cid, 27, "voce nao tem a storage necessaria") doSendMagicEffect(pos, POFF) return false end return true end @CaioPinaa local monster = "Demon" -- Monster name local max = 1 -- Max de summons ativos function onUse(cid, item, fromPosition, itemEx, toPosition) local pos = getCreaturePosition(cid) if table.maxn(getCreatureSummons(cid)) < max then local target = doCreateMonster(monster, pos) doConvinceCreature(cid, target) doSendMagicEffect(pos, 5) else doPlayerSendTextMessage(cid, 27, "Você ja tem a quantidade máxima de summons ativos!") doSendMagicEffect(pos, POFF) return false end return true end
  26. 3 points
    Creaturescript: local hospitalpos = { [1] = {x = 1021, y = 981, z = 7}, -- posições pra onde o player será teleportado ao morrer [2] = {x = 1026, y = 981, z = 7}, [3] = {x = 1030, y = 981, z = 7}, } local str = 66666 function onDeath(cid, position) registerCreatureEvent(cid, "DeathPlayerHospital_L") if isPlayer(cid) then setPlayerStorageValue(cid, str, 1) end return true end function onLogin(cid) registerCreatureEvent(cid, "DeathPlayerHospital") if isPlayer(cid) then if getPlayerStorageValue(cid, str) == 1 then setPlayerStorageValue(cid, str, -1) doTeleportThing(cid, hospitalpos[math.random(#hospitalpos)], true) end end return true end <event type="login" name="DeathPlayerHospital_L" event="script" value="arquivo.lua"/> <event type="death" name="DeathPlayerHospital" event="script" value="arquivo.lua"/>
  27. 2 points
    Olá, esse é um dos primeiros scripts que eu consigo fazer, resolvi trazer ao fórum pois talvez em algum momento da história isso sirva para alguém fazer alguma coisa. Eu também gostaria de ceder todos os créditos desse trabalho para o @WooX, pois sem ele eu não teria o conhecimento necessário para fazer o script funcionar, obrigado. local configuration = { positionParedinso1 = {x=1067, y=1071, z=7, stackpos=1}, -- Posição do objeto que ira sumir time = 1*15*1000, -- tempo para o objeto voltar para o seu lugar devido monstrosTime = 1*10*1000, -- tempo até os monstros despertarem guardioes = { [1] = {name = "Hellfire Fighter", pos = {x = 1065, y = 1071, z = 7}}, -- Todas posições onde os monstros seram criados [2] = {name = "Massive Fire Elemental", pos = {x = 1061, y = 1069, z = 7}}, -- Bem como seus nomes e quantidade [3] = {name = "Fury", pos = {x = 1069, y = 1074, z = 7}}, [4] = {name = "Demon", pos = {x = 1069, y = 1071, z = 7}}, [5] = {name = "Diabolic Imp", pos = {x = 1066, y = 1074, z = 7}}, [6] = {name = "Fire Devil", pos = {x = 1064, y = 1075, z = 7}}, [7] = {name = "Fire Elemental", pos = {x = 1062, y = 1069, z = 7}}, [8] = {name = "Massive Fire Elemental", pos = {x = 1067, y = 1068, z = 7}} } } function onUse(cid, item, fromPosition, itemEx, toPosition) if item.itemid == 1945 then -- alavanca doTransformItem(item.uid, 1946) positionParedinso = getThingFromPos(configuration.positionParedinso1) if positionParedinso.itemid ~= 0 then doRemoveItem(positionParedinso.uid, 1) doCreatureSay(cid, "Um som terrível de engrenagens antigas se movendo pode ser ouvido imediatamente após você puxar a alavanca. \z Estrondos, chamas e vozes demoniacas estão vindo na sua direção, são ouvidos cada vez mais altos, corra por sua vida, \z você acaba fezer um mal antigo despertar.", TALKTYPE_ORANGE_1) -- Mensagem que será exibida após você puxar a alavanca addEvent(function() for k, v in pairs(configuration.guardioes) do doCreateMonster(v.name, v.pos) end end, configuration.monstrosTime) addEvent(doCreateItem, configuration.time, 12794, configuration.positionParedinso1) -- "12794" é o ID da parede que você quer criar após puxar a alavanca end else doTransformItem(item.uid, 1945) end end
  28. 2 points
    Dwarfer

    ANSWERED Autoloot TFS 1.3

    @Yinz Como você não postou o código por completo, tive que supor que se tratava de um autoloot que eu vi por aí certa vez. Tente sempre deixar o código completo pra facilitar o trabalho, ajudar outras pessoas, além de se obter uma solução mais rapidamente pra você também. Espero que minha suposição esteja correta. Bem, eu não tive como testar o código, pois estava sem acesso ao meu computador. Em data/lib, crie um arquivo.lua chamado AutoLootRemove.lua (ou qualquer nome de sua preferência) e cole isto dentro: No global.lua, adicione a linha (ou troque para o nome que você escolheu): dofile('data/lib/AutoLootRemove.lua') Em talkactions/scripts, crie um arquivo.lua e cole isto dentro: No talkactions.xml, adicione a tag conforme desejar. Ex.: <talkaction words="!autolootremove" script="NOMEDOSEUARQUIVO.lua"/> Em seguida, em data/creaturescripts/scripts crie um arquivo.lua e cole isto dentro: No creaturescripts.xml, adicione as linhas: <event type="modalwindow" name="RmvAutoLootModal" script="NOMEDOARQUIVO.lua"/> <event type="login" name="RmvAutoLootLogin" script="NOMEDOARQUIVO.lua"/> Qualquer problema, é só retornar.
  29. 2 points
    Visualizar Anúncio Lyu Freelancer (LUA, C++) Sobre mim : Salve TK, me chamo Moisés e sou conhecido como Lyu. Estudo programação há mais ou menos 5 anos (Autodidata) e tenho referências de donos dos maiores servidores da atualidade. Costumo trabalhar bastante com protocolo 8.60 (tfs 0.3.7 até 1.3) mas também faço serviços para protocolos mais atuais. Como demonstração, irei deixar um vídeo exclusivo do melhor Bomberman (desenvolvido por mim e @Danyel Varejao). Se tem algo que eu sou focado, é em manter a organização dos meus códigos. Como exemplo, irei deixar a configuração do meu Bomberman abaixo.. Bomberman = { name = 'Bomberman', days = { [0] = {'10:00', '22:00'}, [1] = {'10:00', '22:00'}, [2] = {'23:50', '23:57'}, [3] = {'10:00', '22:00'}, [4] = {'10:00', '22:00'}, [5] = {'10:00', '22:00'}, [6] = {'04:21', '22:00'} }, antimc = false, joinpos = {x = 999, y = 1000, z = 7}, time = {warmup = 10, finish = 5, left = 3600, protection = 5, expiredrops = 10, bomb = {detonate = 3, kickspeed = 50}}, min = {level = 80, players = 1}, explosiveitems = {10744}, bombid = 9468, drops = { ['speed'] = { max = 900, description = 'Aumenta a sua velocidade.', [2195] = {upgrade = 50, chance = 45}, [6132] = {upgrade = 75, chance = 37} }, ['range'] = { max = 4, description = 'Aumenta o tamanho da explosão de suas bombas.', [8304] = {upgrade = 1, chance = 45} }, ['bomb'] = { max = 4, description = 'Aumenta a quantidade de bombas que você pode plantar.', [10503] = {upgrade = 1, chance = 45} }, ['special'] = { description = 'Faz suas explosões atravessarem todos os objetos explosíveis.', [10013] = {duration = 10, chance = 10} }, ['life'] = { max = 4, description = 'Adiciona vida ao seu personagem.', [11393] = {upgrade = 1, chance = 10} }, ['shield'] = { description = 'Cria um campo de proteção contra qualquer tipo de explosão.', [8905] = {duration = 5, chance = 15} }, ['kick'] = { description = 'Esta bota lhe permite chutar qualquer tipo de explosivo sem ferir seus pés.', [9932] = {chance = 7} } }, spawns = { [1] = {x = 1177, y = 1031, z = 7}, [2] = {x = 1167, y = 1031, z = 7}, [3] = {x = 1157, y = 1031, z = 7}, [4] = {x = 1177, y = 1021, z = 7}, [5] = {x = 1167, y = 1021, z = 7}, [6] = {x = 1157, y = 1021, z = 7}, [7] = {x = 1177, y = 1011, z = 7}, [8] = {x = 1167, y = 1011, z = 7}, [9] = {x = 1157, y = 1011, z = 7} }, lifes = { [1] = {square = COLOR_DARKGREY, outfit = {lookHead = 0, lookBody = 95, lookLegs = 95, lookFeet = 0}}, [2] = {square = COLOR_RED, outfit = {lookHead = 0, lookBody = 113, lookLegs = 113, lookFeet = 0}}, [3] = {square = COLOR_YELLOW, outfit = {lookHead = 0, lookBody = 79, lookLegs = 79, lookFeet = 0}}, [4] = {square = COLOR_LIGHTGREEN, outfit = {lookHead = 0, lookBody = 82, lookLegs = 82, lookFeet = 0}} }, rewards = {{2160, 50}, {2352, 1}}, registers = {'BMThrow', 'BMDirection', 'BMPush'} } Entre em contato comigo pelo Discord: Lyuzera#8767 Anunciante Lyu Date 06/03/2019 Preço Categoria Procura-se Jobs  
  30. 2 points
    DdJs

    [Procura-se Jobs]DdJs Mapping [Freelancer]

    Visualizar Anúncio DdJs Mapping [Freelancer] DdJs Mapping • Preços acessíveis - Affordable prices • Trabalho com mapas de qualquer versão - Work with maps of any version • Cavernas, cidades e quests - Caves, cities and quests Para ver mais dos meus trabalhos postados no TibiaKing, acesse: Meu conteúdo To see more of my works posted in TibiaKing, acess: My content Discord: FelipeBR#3714 Me mande uma mensagem privada Send me a private message Métodos de Pagamento/Payment Methods: • PayPal [Pagamentos via PayPal tem um acréscimo de R$ 5,00 ao valor devido as taxas da plataforma/Payments via PayPal has an increase of US$ 2,00 to the amount due the platform fees] • Depósito em Conta / Account Deposit Um (01) suporte gratuito após a entrega (se requisitado for pelo cliente). One (01) free support after delivery (if requested by the customer). *Informações de Importância/Important Information* • Não trabalho com derivados/ATS (Pokémon, Naruto, DBO, etc). • I do not work with derivatives/ATS. (Leia) Sistema de pagamento: Por garantia e segurança, o pagamento deverá ser feito antes da entrega, sendo dado ao cliente o valor total do serviço, e este valor dividido em duas (2) vezes a ser pago. Uma parcela antes de iniciar os trabalhos, para fins de garantia, de que o cliente esteja em compromisso com o provedor do serviço, esse valor não é estornável, visto que uma vez recebido será iniciado o serviço. A segunda parte do pagamento deverá ser feita antes da entrega do produto/serviço, após o cliente confirmar por meio de prints que está de acordo com o que queria. (Read) Payment system: For guarantee and security, payment must be made before delivery, being given to the customer the total value of the service, and this amount divided into two (2) parts to be paid. One portion before starting work, for warranty purposes, that the customer is committed to the provider of the service, this value is not voidable, once the service is started once it has been received. The second part of the payment must be made before delivery of the product / service, after the customer confirm through prints that it is according to what you wanted. Anunciante DdJs Date 21/05/2019 Preço Categoria Procura-se Jobs  
  31. 2 points
    Storm

    ANSWERED Spell Mod God

    @Phineasz
  32. 2 points
    DdJs

    Gargoyles Tower | Cave Hunt | 7.4

    Gargoyles Tower Version: 7.4 Type: .Rar Size: 17KB Position(s): [X: 1014 Y: 1034 Z: 7] File password: tibiaking Images:
  33. 2 points
    Yan Liima

    Cast system tsf 0.4

    @yazanki com base no que o WooX disse, e pelo que eu e ele conversamos. Fiz um script que testei aqui e funcionou perfeitamente. Ele verifica se há jogadores online no cast, se tiver ele irá executar a função a cada 1s(configuravel no xml), para atualizar o valor no banco de dados, assim atualizando no site Em globalevents.xml add: <globalevent name="castViewers" interval="10000" event="script" value="castViewers.lua"/> castViewers.lua: function onThink(interval) for _, pid in ipairs(getCastsOnline()) do local count = 0 local cast = getCastViewers(pid) for _,v in pairs(cast) do count = count + 1 end db.query("UPDATE `players` set `castViewers` = '" .. count .."' where `id` = '".. getPlayerGUID(pid) .."';") end return true end Bem simples xD
  34. 2 points
    JoviM

    Old Kaio

    @Phineasz
  35. 2 points
    celohere

    TFS 1.2 [8.0]

    Esse é o tfs downgraded pelo Ninja da Otland , eu fiz umas mudanças pra deixar ele mais legal (na minha opinião) . E agora eu quero disponibilizar pra todos esse download , com a intenção de contribuir pelo menos um pouco com a comunidade. Eu apenas quero avisar que não sou um programador profissional , e talvez eu tenha feito alguma ***** , mas até o momento nao encontrei nenhum bug crítico.Eu não sei se esse server é estável pq nao cheguei a por ele online , enfim todos os créditos vão para o Ninja da Otland pelo downgrade ,para o tfs team pelo distro em si e pra mim Celohere por essas alterações. Changelog Bugs esse download contêm o servidor compilado ,um itemeditor , o arquivo Tibia.Dat e Tibia.Spr ja alterados pra resolver o problema das runas e as sources do servidor . Se alguem encontrar qualquer bug , ou se conseguir arrumar algum bug , por favor compartilhem tbm , a comunidade de Otservers é feita destas atitudes , nem todos querem abrir um servidor pra ganhar dinheiro , muitos simplesmente querem um server pra se divertir com os amigos. Então não custa compartilhar boas soluções .Isso é tudo pessoal 😃 algumas fotos do servidor rodando: EDIT: novo link: fixed crash on re-login -- credits to danielsalim1 and mattyx14 -- fixed monster walk dashing -- credits to me -- EDIT 2: fix players login in the same sqm link: http://www.mediafire.com/file/918b37nohagk5bg/forgottenserver-8.0.rar/file scan: https://www.virustotal.com/gui/file/dbd00b477b00e597d51b86307277c2c52dce8119379e38698af9c1b47e56f039/detection EDIT 3: fixed runes stack on full container bug -- crédits to me -- eu criei um repositório no github ,se alguem quiser reportar algum bug ou quiser me ajudar com algum fix ,sera muito bem vindo https://github.com/celohere/tfs-1.2-8.0 forgottenserver8.0.rar
  36. 2 points
    @Neox304 Utiliza o addEvent(callback, delay, ...). Você pode criar uma função dentro do addEvent() ou chamar uma função... Ex_1: addEvent(function() doCreateMonster(monstro, pos) end, 10*1000) -- 10 * 1000 é o tempo para criar o monstro. Ex_2: function createMonster() doCreateMonster(monstro, pos) end (...) addEvent(createMonster, 10*1000, cid)
  37. 2 points
    WooX

    Cast system tsf 0.4

    Não precisa alterar a source, da pra fazer em Lua mesmo. Não é um problema exclusivo do cast do summ, o do elf também é necessário script pra atualizar os viewers.
  38. 2 points
    gabriel28

    AJUDA COM SCRIPT PARA MAGIA

    @Kenpachi Br local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, 10) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1497) local arr = { { 1, 1, 1, 1, 1, 1. }, { 1, 0, 0, 0, 0, 1. }, { 1, 0, 0, 0, 0, 1, }, { 1, 0, 0, 2, 0, 1, }, { 1, 0, 0, 0, 0, 1, }, { 1, 0, 0, 0, 0, 1, }, { 1, 1, 1, 1, 1, 1, }, } local area = createCombatArea(arr) setCombatArea(combat, area) function onCastSpell(cid, var) local storage = 50054 -- nao mexer caso nao saiba do que se trata local waittime = 30 -- tempo em segundos ate poder usar de novo if exhaustion.check(cid, storage) then doPlayerSendCancel(cid, "Espere "..exhaustion.get(cid, storage).." para usar essa magia novamente.") return false end exhaustion.set(cid, storage, waittime) return doCombat(cid, combat, var) end
  39. 2 points
    Olá galera! Estive procurando um ot de war para jogar, mas hoje em dia nao vi qualidade nos ots, e queria sentir aquela nostalgia de antigamente dos ots war que trocavam mapa e dividiam times para war! decidi eu mesmo criar um! pois eu procurei e nao achei nenhuma base que fosse assim! nao implantei erros propositais para crashar ou algo do tipo , os arquivos estao bem limpos como sao poucos scripts é facil checar se há bugs! pois usei a base original do Mattyx na GitHub. está 100% estavel entao vamos la! OQUE POSSUI? DOWNLOAD LINK SCAN VIRUSTOTAL quem colocar online manda pm pra tirar um x1 😅!
  40. 2 points
    Reds

    [Spell] Chuva de Flechas 2.0

    Olá, há muitos anos publiquei um script no tibiaking de uma spell onde acontecia uma chuva de flechas, agora em 2019 eu refiz vários dos scripts do meu antigo servidor e este foi um deles. Basicamente eu simplifiquei o código (não tinha conhecimento suficiente para isso na época) e corrigi um dos bugs que existia, enfim segue o script: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_NONE) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -60, -1, -60, 5, 5, 4, 7) function onTargetCombat(cid, target) local posCid = getCreaturePosition(cid) local posTarget = getCreaturePosition(target) doSendDistanceShoot(posCid, posTarget, CONST_ANI_ONYXARROW) end setCombatCallback(combat, 4, "onTargetCombat") local area = createCombatArea(AREA_CROSS6X6) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end xml: <instant name="Chuva de Flechas" words="chuva de flechas" lvl="80" manapercent="25" prem="1" soul="0" aggressive="0" exhaustion="1000" selftarget="1" needlearn="0" event="script" value="especiais/mas shadow.lua"> <vocation id="2"/> <vocation id="6"/> </instant> Vou publicar o mesmo gif de demonstração pois a funcionalidade segue praticamente a mesma: https://giphy.com/gifs/r0DNAlUJKUxeo Espero que tenham gostado e notado como um código pode ser bem mais simples do que parece..
  41. 2 points
    Nolis

    Remover monstro automaticamente

    Use esse script para remover criaturas de tempo em tempo em uma determinada área do mapa. -- -- -- Em data/globalevents/cria um arquivo chamado removemonster.lua local config = { fromPos = {x=556,y=451,z=6}, -- posição superior esquerda do mapa, da area em que esta mapeado a area. toPos = {x=566,y=456,z=6}, -- posição inferior direita do mapa, da area em que esta mapeado a area. boss = "Nomedomonstroaqui" -- Aqui você bota o nome do monstro que você quer remover } function onTime() removeMonsterInArea(fromPos, toPos) return true end function removeMonsterInArea() local positionsCheck = {} for i = config.fromPos.x, config.toPos.x do positionsCheck[#positionsCheck+1] = {x=i, y = config.fromPos.y, z = config.fromPos.z, stackpos = 0} for j = config.fromPos.y+1, config.toPos.y do positionsCheck[#positionsCheck+1] = {x=i, y = j, z = config.fromPos.z, stackpos = 0} end end for j=1, #positionsCheck do for i = 0, 255 do positionsCheck[j].stackpos = i local tile = getTileThingByPos(positionsCheck[j]) if isMonster(tile.uid) then if getCreatureName(tile.uid) == config.boss then doRemoveCreature(tile.uid) end end end end end TAG: <globalevent name="removemonster" time="03:00" event="script" value="removemonster.lua"/> time="03:00" representa 3horas AM
  42. 2 points
    lordzetros

    PZ locked magic wall tfs 1.3

    No TFS 1.3 não tem função para adicionar o pzLocked que gostaria no jogador, portanto, modifique sua source com essas alterações: em Luascript.h static int luaPlayerPzLocked(lua_State* L); E em Luascript.cpp (cole abaixo de um semelhante) Código 1: registerMethod("Player", "pzLock", LuaScriptInterface::luaPlayerPzLocked); Código 2 (abaixo/acima de um semelhante também): int LuaScriptInterface::luaPlayerPzLocked(lua_State* L) { // player:pzLock(true/false, default = false) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } bool pzLock = getBoolean(L, 2, false); player->pzLocked = pzLock; return 1; } E para finalizar, vai na sua spell de magic wall e deixe desta forma: local combat = Combat() combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) combat:setParameter(COMBAT_PARAM_CREATEITEM, ITEM_MAGICWALL) function onCastSpell(creature, variant, isHotkey) creature:pzLock(true) return combat:execute(creature, variant) end
  43. 2 points
    Nolis

    Healling Spell usando SoulPoints

    Esse foi um dos meus primeiros scripts, é uma spell (adaptada por emersonsss) de cura instantânea que utiliza Soul Points para curar o druid. Se ele não tiver soul points e invocar a magia, a força da natureza pega a energia da vida dele e acaba não curando, o deixando no prejuízo. function onCastSpell(cid, var) if isDruid(cid) then if getPlayerSoul(cid) >= 100 then local maxh = getCreatureMaxHealth(cid) doCreatureAddHealth(cid, maxh) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_RED) doPlayerAddSoul(cid, -100) doPlayerSendTextMessage(cid, 22, 'You used your soul successfully!') else  doPlayerSendCancel(cid, "You dont have 100 soul.") end else doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_POFF) doPlayerSendTextMessage(cid, 21, 'You are not druid, as punishment, the ancient gods will punish you removing you life.') doPlayerSendTextMessage(cid, 21, 'Dont try this again!') doCreatureAddHealth(cid, -5) end return true end Em forma de comando: Em data/talkactions/scripts, copie um arquivo, renomeie para druidprotection e adicione o script function onSay(cid, words, param, channel) if isDruid(cid) then if getPlayerSoul(cid) >= 100 then local maxh = getCreatureMaxHealth(cid) doCreatureAddHealth(cid, maxh) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_RED) doPlayerAddSoul(cid, -100) doPlayerSendTextMessage(cid, 22, 'You used your soul successfully!') else doPlayerSendCancel(cid, "You dont have 100 soul.") end else doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_POFF) doPlayerSendTextMessage(cid, 21, 'You are not druid, as punishment, the ancient gods will punish you removing you life.') doPlayerSendTextMessage(cid, 21, 'Dont try this again!') doCreatureAddHealth(cid, -5) end return true end Em data/talkactions/talkactions.xml adicione a tag: <talkaction words="!druidprotection" event="script" value="druidprotection.lua"/>
  44. 2 points
    @victor4312 Substitui na script; doPlayerSendTextMessage(cid, 27, "Espere ".. math.floor(exhaustion.get(cid, config.exaust_sto) / 60) .." minuto(s) e ".. exhaustion.get(cid, config.exaust_sto) - (math.floor(exhaustion.get(cid, config.exaust_sto) / 60)*60) .." segundo(s) para usar seu pet novamente.")
  45. 2 points
    @victor4312 local config = { name = "Demon", -- Nome do Summon storage = 42355, -- Storage que permite o uso exaust_sto = 5555, -- Storage que contabiliza o exaust exaust_time = 60 -- Segundos de Exaust } function onUse(cid, item, fromPosition, itemEx, toPosition) local pos = getCreaturePosition(cid) if getPlayerStorageValue(cid, config.storage) == 1 then if not exhaustion.check(cid, config.exaust_sto) then local target = doCreateMonster(config.name, pos) doConvinceCreature(cid, target) doSendMagicEffect(pos, CONST_ME_TELEPORT) exhaustion.set(cid, config.exaust_sto, config.exaust_time) return true else doPlayerSendTextMessage(cid, 27, "Exhaustion!! Wait ".. exhaustion.get(cid, config.exaust_sto) .." seconds.") doSendMagicEffect(pos, POFF) return false end else doPlayerSendTextMessage(cid, 27, "voce nao tem a storage necessaria") doSendMagicEffect(pos, POFF) return false end return true end
  46. 2 points
    @louco3626 <movevent type="StepIn" actionid="11555;11556" event="script" value="tile.lua"/> <movevent type="StepOut" actionid="11555;11556" event="script" value="tile.lua"/> local config = { fail_tile = 11555, -- ActionID do tile que matará right_tile = 11556, -- ActionID do tile certo new_tile_id = 406, -- Piso branco old_tile_id = 407 -- Piso preto } function onStepIn(cid, item, position, fromPosition) local pos = getCreaturePosition(cid) if isPlayer(cid) and not isPlayerGhost(cid) then if item.actionid == config.fail_tile then doCreatureAddHealth(cid, -getCreatureMaxHealth(cid)) doSendMagicEffect(pos, CONST_ME_POFF) return true elseif item.actionid == config.right_tile then doTransformItem(item.uid, config.new_tile_id) doSendMagicEffect(pos, CONST_ME_TELEPORT) return true end end return true end function onStepOut(cid, item, position, fromPosition) local pos = getCreaturePosition(cid) if isPlayer(cid) and not isPlayerGhost(cid) then if item.actionid == config.right_tile then doTransformItem(item.uid, config.old_tile_id) doSendMagicEffect(pos, CONST_ME_POFF) return true end end return true end
  47. 2 points
    @CaioPinaa Você não detalhou muito bem, então testa assim: local monster = "Demon" -- Monster name function onUse(cid, item, fromPosition, itemEx, toPosition) local pos = getCreaturePosition(cid) local target = doCreateMonster(monster, pos) doRemoveItem(item.uid, 1) doConvinceCreature(cid, target) doSendMagicEffect(pos, 5) return true end
  48. 1 point
    lordzetros

    World of Tibia™ - Project RPG

    Parece bacana, boa sorte com o projeto. Tentarei acompanhar.
  49. 1 point
    Savage1G

    Dragon Ball Universe [DBKO][8.6]

    Thanks appreciate your support. Indeed thats how this server born i was playing dbko for 6-7 years so me and my team created this server with all experience we had and with knowledge what people want
  50. 1 point
    Esse sistema disponibiliza uma negociação offline, onde você oferta um item e esse item é divulgado no site do server e qualquer player pode comprar o item utilizando um comando especificado. Crie uma arquivo .lua dentro da pasta data/talkactions/scripts com o nome auctionsystem.lua, dentro do mesmo adicione o code: local config = { levelRequiredToAdd = 20, maxOffersPerPlayer = 5, SendOffersOnlyInPZ = true, blocked_items = {2165, 2152, 2148, 2160, 2166, 2167, 2168, 2169, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2343, 2433, 2640, 6132, 6300, 6301, 9932, 9933} } function onSay(cid, words, param, channel) if(param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.") return true end local t = string.explode(param, ",") if(t[1] == "add") then if((not t[2]) or (not t[3]) or (not t[4])) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.") return true end if(not tonumber(t[3]) or (not tonumber(t[4]))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't set valid price or items count.") return true end if(string.len(t[3]) > 7 or (string.len(t[4]) > 3)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This price or item count is too high.") return true end local item = getItemIdByName(t[2]) if(not item) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Item wich such name does not exists.") return true end if(getPlayerLevel(cid) < config.levelRequiredToAdd) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have required (" .. config.levelRequiredToAdd .. ") level.") return true end if(isInArray(config.blocked_items, item)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This item is blocked.") return true end if(getPlayerItemCount(cid, item) < (tonumber(t[4]))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, you don't have this item(s).") return true end local check = db.getResult("SELECT `id` FROM `auction_system` WHERE `player` = " .. getPlayerGUID(cid) .. ";") if(check:getID() == -1) then elseif(check:getRows(true) >= config.maxOffersPerPlayer) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry you can't add more offers (max. " .. config.maxOffersPerPlayer .. ")") return true end if(config.SendOffersOnlyInPZ) then if(not getTilePzInfo(getPlayerPosition(cid))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must be in PZ area when you add offert to database.") return true end end if(tonumber(t[4]) < 1 or (tonumber(t[3]) < 1)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have to type a number higher than 0.") return true end local itemcount, costgp = math.floor(t[4]), math.floor(t[3]) doPlayerRemoveItem(cid, item, itemcount) db.executeQuery("INSERT INTO `auction_system` (`player`, `item_name`, `item_id`, `count`, `cost`, `date`) VALUES (" .. getPlayerGUID(cid) .. ", \"" .. t[2] .. "\", " .. getItemIdByName(t[2]) .. ", " .. itemcount .. ", " .. costgp ..", " .. os.time() .. ")") doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You successfully add " .. itemcount .." " .. t[2] .." for " .. costgp .. " gps to offerts database.") end if(t[1] == "buy") then if(not tonumber(t[2])) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.") return true end local buy = db.getResult("SELECT * FROM `auction_system` WHERE `id` = " .. (tonumber(t[2])) .. ";") if(buy:getID() ~= -1) then if(getPlayerMoney(cid) < buy:getDataInt("cost")) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don't have enoguh GP.") buy:free() return true end if(getPlayerName(cid) == getPlayerNameByGUID(buy:getDataInt("player"))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, you can't buy your own items.") buy:free() return true end if(getPlayerFreeCap(cid) < getItemWeightById(buy:getDataInt("item_id"), buy:getDataInt("count")))then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You try to buy a " .. buy:getDataString("item_name") .. ". It weight " .. getItemWeightById(buy:getDataInt("item_id"), buy:getDataInt("count")) .. " cap oz. and you have only " .. getPlayerFreeCap(cid) .. " oz. free capacity. Put some items to depot and try again.") buy:free() return true end if(isItemStackable((buy:getDataString("item_id")))) then doPlayerAddItem(cid, buy:getDataString("item_id"), buy:getDataInt("count")) else for i = 1, buy:getDataInt("count") do doPlayerAddItem(cid, buy:getDataString("item_id"), 1) end end doPlayerRemoveMoney(cid, buy:getDataInt("cost")) db.executeQuery("DELETE FROM `auction_system` WHERE `id` = " .. t[2] .. ";") doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You bought " .. buy:getDataInt("count") .. " ".. buy:getDataString("item_name") .. " for " .. buy:getDataInt("cost") .. " gps!") db.executeQuery("UPDATE `players` SET `auction_balance` = `auction_balance` + " .. buy:getDataInt("cost") .. " WHERE `id` = " .. buy:getDataInt("player") .. ";") buy:free() else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.") end end if(t[1] == "remove") then if((not tonumber(t[2]))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.") return true end if(config.SendOffersOnlyInPZ) then if(not getTilePzInfo(getPlayerPosition(cid))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You must be in PZ area when you remove offerts from database.") return true end end local delete = db.getResult("SELECT * FROM `auction_system` WHERE `id` = " .. (tonumber(t[2])) .. ";") if(delete:getID() ~= -1) then if(getPlayerGUID(cid) == delete:getDataInt("player")) then db.executeQuery("DELETE FROM `auction_system` WHERE `id` = " .. t[2] .. ";") if(isItemStackable(delete:getDataString("item_id"))) then doPlayerAddItem(cid, delete:getDataString("item_id"), delete:getDataInt("count")) else for i = 1, delete:getDataInt("count") do doPlayerAddItem(cid, delete:getDataString("item_id"), 1) end end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your offert has been deleted from offerts database.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "This is not your offert!") end delete:free() else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wrong ID.") end end if(t[1] == "withdraw") then local balance = db.getResult("SELECT `auction_balance` FROM `players` WHERE `id` = " .. getPlayerGUID(cid) .. ";") if(balance:getDataInt("auction_balance") < 1) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don't have money on your auction balance.") balance:free() return true end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You got " .. balance:getDataInt("auction_balance") .. " gps from auction system!") doPlayerAddMoney(cid, balance:getDataInt("auction_balance")) db.executeQuery("UPDATE `players` SET `auction_balance` = '0' WHERE `id` = " .. getPlayerGUID(cid) .. ";") balance:free() end return true end Em seguida em talkactions.xml adicione a tag: <talkaction words="!offer" event="script" value="auctionsystem.lua"/> No banco de dados execute as querys: CREATE TABLE `auction_system` ( `id` int(11) NOT NULL auto_increment, `player` int(11), `item_id` int(11), `item_name` varchar(255), `count` int(11), `cost` int(11), `date` int(11), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; ALTER TABLE `players` ADD `auction_balance` INT( 11 ) NOT NULL DEFAULT '0'; Na pasta do seu site crie um arquivo chamado tradeoff.php, em seguida adicione o code: <?PHP $auctions = $SQL->query('SELECT `auction_system`.`player`, `auction_system`.`id`, `auction_system`.`item_name`, `auction_system`.`item_id`, `auction_system`.`count`, `auction_system`.`cost`, `auction_system`.`date`, `players`.`name` FROM `auction_system`, `players` WHERE `players`.`id` = `auction_system`.`player` ORDER BY `auction_system`.`id` DESC')->fetchAll(); $players = 0; $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR="'.$config['site']['vdarkborder'].'"><TD CLASS=white><b>Instruction<b></TD></TR><TR BGCOLOR='.$config['site']['darkborder'].'><TD><center><h2>Commands</h2><b>!offer add, itemName, itemPrice, itemCount</b><br /><small>example: !offer add, plate armor, 500, 1</small><br /><br /><B>!offer buy, AuctionID</b><br /><small>example: !offer buy, 1943</small><br /><br /><b>!offer remove, AuctionID</b><br /><small>example: !offer remove, 1943</small><br /><br /><b>!offer withdraw</b><br /><small>Use this command to get money for sold items.</small></center></TR></TD></TABLE><br />'; if(empty($auctions)) { $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR="'.$config['site']['vdarkborder'].'"><TD CLASS=white><b>Auctions</b></td></TR><TR BGCOLOR='.$config['site']['darkborder'].'><TD>Currently is no one active Auction.</TD></TR></TABLE>'; $main_content .= '<br /><p align="right"><small>System created by <a href="http://otland.net/members/vDk/">vDk</a>.</small></p>'; } else { foreach($auctions as $auction) { $players++; if(is_int($players / 2)) $bgcolor = $config['site']['lightborder']; else $bgcolor = $config['site']['darkborder']; $cost = round($auction['cost']/1000, 2); $content .= '<TR BGCOLOR='.$bgcolor.'><TD><center>'.$auction['id'].'</center></TD><TD><center><img src="/item_images/'.$auction['item_id'].'.gif"/></center></TD><TD><center>'.$auction['item_name'].'</center></TD><TD><center><a href="?subtopic=characters&name='.urlencode($auction['name']).'">'.$auction['name'].'</a></center></TD><TD><center>'.$auction['count'].'</center></TD><TD><center>'.$cost.'k<br /><small>'.$auction['cost'].'gp</small></center></TD><TD><center>!offer buy, '.$auction['id'].'</center></TR>'; } $main_content .= '<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 WIDTH=100%><TR BGCOLOR="'.$config['site']['vdarkborder'].'"><TD CLASS=white><b><center>ID</center></b></TD><TD class="white"><b><center>#</center></b></TD><TD class="white"><b><center>Item Name</center></b></TD><TD class="white"><b><center>Player</center></b></TD><TD class="white"><b><center>Count</center></b></TD><TD class="white"><b><center>Cost</center></b></td><TD class="white"><b><center>Buy</center></b></td></TR>'.$content.'</TABLE>'; $main_content .= '<br /><p align="right"><small>System created by <a href="http://otland.net/members/vdk.1553/">vDk</a>.</small></p>'; } ?> Em layouts.php adcione o code: <a href="?subtopic=tradeoff"> <div id="submenu_tradeoff" class="Submenuitem" onmouseover="MouseOverSubmenuItem(this)" onmouseout="MouseOutSubmenuItem(this)"> <div class="LeftChain" style="background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);"></div> <div id="ActiveSubmenuItemIcon_tradeoff" class="ActiveSubmenuItemIcon" style="background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);"></div> <div id="ActiveSubmenuItemLabel_tradeoff" class="SubmenuitemLabel">Trade Off</div> <div class="RightChain" style="background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);"></div> </div> </a> Pra finalizar em index.php adicione esse code: case "tradeoff"; $topic = "Trade Off"; $subtopic = "tradeoff"; include("tradeoff.php"); break; - E pronto galera clica em GOSTEI e comenta no tópico.
This leaderboard is set to Sao Paulo/GMT-03:00

Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia partindo do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer publicidade para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução! A publicação do seu anuncio é instantânea!

×
×
  • Create New...