Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 12/12/15 em %
-
Vamos Programar? - Introdução
Hisokafailll e um outro reagiu a Oneshot por um tópico no fórum
Vamos Programar? Introdução Olá, pessoal. Acredito que ninguém aqui me conheça, mas sou Oneshot, ou Bruno Lopes, um programador por passatempo. Desenvolvi muitos trabalhos para fóruns em geral, principalmente o XTibia, até que levei uma flecha no joelho... ... Brincadeiras a parte, eu gostaria muito de voltar a escrever tutoriais e quem sabe desenvolver novos recursos para a comunidade, depende muito do meu tempo disponível. Para essa primeira parte do tutorial, eu gostaria de tratar de um assunto que é subestimado por muitos... Não, eu não vou falar de lógica da programação, de Lua, ou de C++... eu vou falar sobre o editor de texto, a principal ferramenta de um programador. Muitos aqui, provavelmente começam sua vida de scripter utilizando o Notepad++ no Windows, ou talvez um gedit em alguns flavors do Linux, talvez até o vim, se você for muito hardcore Eu já usei vários editores de texto, e ultimamente tenho recomendado um editor de texto excelente, desenvolvido pela equipe do Github, chamado Atom. Eu poderia muito bem fazer deste tópico, um comparativo entre os editores de texto e até alguns IDEs (ou Integrated Development Environment), mas vou fazer deste, um tutorial para configuração do Atom e espero que vocês gostem. Atom Atom, conforme o criador, é um editor de texto totalmente personalizável, você pode editar todos os tipos de configurações dentro dele, mas também se não quiser, não é necessário. E acho que esse é o diferencial do Atom, existem muitos plugins de excelente qualidade, e você não vai precisar usar ele só para programar Lua, pode usar ele em um monte de sintaxes diferentes e se ele não tiver uma sintaxe, basta baixar um plugin que certamente existirá com a sintaxe, snippets (trechos de código pré-configurados), entre outros. Você vai baixar o Atom no site deles, http://atom.io/, no momento que escrevo esse artigo/tutorial, estou no Windows 10 (Ao invés do Fedora), então veja abaixo: Depois de baixar o instalador para sua plataforma (Ele está disponível para Windows, Linux e Mac), basta instalar o aplicativo, conforme os padrões do seu sistema (Next, Next, Next no Windows e por aí vai) Depois disso o Atom é apresentado da seguinte forma: Não tão dessa forma... estou com o tema da interface Seti-UI. Se você for curioso, pode então ler a documentação do Atom, e eu recomendo, pois você vai aprender muito lá, e se tiver noções de programação, já poderá aprender a personalizar seu Atom. Vamos baixar alguns plugins, para isso você pode ir no menu Packages > Settings View > Install Packages/Themes ou pressionar Ctrl+Shift+P (No caso do Windows), digitar Install e escolher a opção, e eu uso muito essa segunda forma: No menu que irá abrir, você pode procurar diversos plugins e temas, na página inicial ele mostra os plugins em destaque: Daqui não tem segredo, pesquise o nome do plugin, ele vai aparecer e então clique em Install, abaixo deixo alguns plugins que eu uso, e nem todos são voltados para Open Tibia. PluginsOpen Recent - Abre arquivos recentes Minimap - Mostra um minimapa com todo o código do arquivo Highlight Selected - Quando você seleciona uma palavra, ele seleciona todas as ocorrências Pigments - Voltado para Front-End, mostra a cor de um código hexadecimal de um arquivo CSS Linter* - Uma função muito presente em IDEs, que mostra algum erro no código, como um ';' faltando Auto-Detect-Indentation - Detecta a indentação de um arquivo e configura a indentação do seu TAB automaticamente) Atom-Beautify - Um "embelezador" de código Emmet - Para front-ends preguiçosos. language-lua - Para adicionar a sintaxe Lua no atom TemasSeti-UI - Um excelente tema com ícones para cada tipo de arquivo. Atom-Monokai - Um tema de sintaxe bem parecido com o Sublime. E tem muitos outros plugins excelentes... No caso do Linter, você precisa baixar o plugin principal, e então o plugin secundário para a linguagem que você pretende utilizar (Não sei se existe um Linter para Lua) Depois disso, você pode ir na opção Themes e mudar o tema de interface e de sintaxe: E por último, mudar algumas configurações a seu gosto: Cada configuração tem sua explicação em inglês. Esse é o Atom, configurado com os plugins do tutorial, com sintaxe Lua, a linha branca cruzando o arquivo é um separador que delimita 80 caracteres e quebra o código que passar disso, dando mais legibilidade. E o mais legal é que o Atom tem um modo de identificar funções diferente do Notepad++, então ele identifica até as funções Open Tibia no seu código. Legal, né? Conclusão Bom, é isso aí, esssa foi a primeira parte de uma sequência de tutoriais que pretendo fazer quando tiver tempo livre, afinal não consigo largar o Open Tibia. Espero que gostem. Abraços.2 pontos -
Eae galera do xtibia, hoje venho apresentar à vocês meu primeiro post, um módulo de Tutorial no OTC, parecido com o da PXG que você pode usar e customizar, basta ter um pouco de conhecimento ! (Se estiver em área errada peço que movam) Print: Bom, o script está pronto, mas se quiser editar, mexa apenas em configs_pt e em configs_en, nesses 2 arquivos, vocês editem o que quiserem e na pasta imgs vocês colocam as imagens (caso editem) na mesma resolução ! Link de download do módulo: Scan: Arquivos estão ocultos, para conseguir habilitar no Windows 7: Arquivos estão ocultos, para conseguir habilitar no Windows 8: Bom é só isso, até a próxima ! Créditos: Pokémon Waterfall por algumas partes dos scripts e imagens. WOP por algumas partes dos scripts e imagens. PXG por algumas imagens.1 ponto
-
Map editor e Item editor 10.90!
SkyLigh reagiu a Administrador por um tópico no fórum
Todos conhecem esse magnífico editor, não? Saibam que já está disponível a versão que suporta o último protocolo do tibia (10.90). Para baixar o programa clique aqui Créditos aos grandes: Mignari @Bruno Para baixar o Map Editor, clique aqui. Créditos Colaboradores - Projeto Oficial @Bruno1 ponto -
10.80+ Medusa Tower
lokoga reagiu a Administrador por um tópico no fórum
Medusa Tower Coordenadas: x:32872 y:32833 z:7 Medusa Tower 10.80+.rar Scan1 ponto -
(SoT) Script of Tales #01
Night Wolf reagiu a Caronte por um tópico no fórum
Bem vindos! Bem vindos... Á primeiríssima edição do SoT! Se você é scripter, gosta de um desafio e curte interagir com a comunidade, então participe deste evento. O evento SoT tem como objetivos promover a interação entre scripters da comunidade, dar a oportunidade de membros conquistarem prêmios e trocar conhecimento sobre a área. Aproveitando o espírito natalino com essa edição mega criativa, espero ver bastante participantes. Calendário 11/12/2015 - Lançamento e Início 05/01/2016 - Prazo para enviar o script 05-07/01/2016 - Avaliações dos jurados 07-08/01/2016 - Resultado Premiação 1º Lugar • Indicação à xTibia Gold Achievement 2015 (Conquista Exclusiva) • O Melhor Scripter (Conquista exclusiva) • Gold (Conquista) • 25 Rep 2º Lugar • Indicação à xTibia Silver Achievement 2015 (Conquista Exclusiva) • Silver (Conquista) • 15 Rep 3º Lugar • Bronze (Conquista) • 10 Rep Regras • Aplicam-se as regras gerais do fórum neste evento • Em caso de plágio, o participante será eliminado e poderá ser punido • Calendário, premiação e regras estão sujeitos a mudanças • Todos os trabalhos serão liberados à comunidade depois do evento1 ponto -
(SoT) Script of Tales #01
Administrador reagiu a Gabrieltxu por um tópico no fórum
Curti a historia , da para fazer muita coisa legal com o tema , bom talves irei participar , se me sobrar algum tempo xD , boa sorte a todos os competidores1 ponto -
Comentar aqui só para reativar essa conta.. Os mapas estão muito bons, da fazer uma análise legal nesse trabalho que você faz com os formatos e bordering (sei que demanda muito tempo) e, no seu caso, ficam excelentes. Grande abraço manin, continue trazendo mapas assim!!1 ponto
-
Vamos Programar? - Introdução
Administrador reagiu a Oneshot por um tópico no fórum
Sim, mas o Brackets é voltado totalmente para front-end1 ponto -
[Arquivado](Discussão) Divulgando seu Servidor
Danihcv reagiu a Piabeta Kun por um tópico no fórum
local errado ja que aqui eh a seçao de tibia global!1 ponto -
vip system o que tem errado
alissonxzff2 reagiu a Kemix por uma questão
function onStepIn(cid, item, position, fromPosition) local config = { msgDenied = "Você não e vip II , faça a quest vip II ", msgWelcome = "Seja Bem Vindo a Area vip II." } if getPlayerStorageValue(cid, 13540) <= 0 then doTeleportThing(cid, fromPosition, true) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, config.msgDenied) doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE) return TRUE end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, config.msgWelcome) return TRUE end1 ponto -
[Danera] Theus Stor [LV: 17]
SkyDangerous reagiu a Gabriel Couto por um tópico no fórum
Boa sorte! Se é que precisa né, com esses itens hahaha1 ponto -
[Ajuda] Vida e Mana full ao upar
Guizera123 reagiu a Luga03 por uma questão
Cara, está ai o seu problema! substitui por este código: local config = { savePlayer = true } function onAdvance(cid, skill, oldLevel, newLevel) if(skill == SKILL__EXPERIENCE) then return true end if(config.savePlayer) then doPlayerSave(cid, true) end return true end Pronto '-' Problema resolvido kk1 ponto -
Novos Estagiários
Administrador reagiu a Kluivert por um tópico no fórum
Gostei dos mapas ... parabéns aos dois novos estagiários!1 ponto -
Show Off (Gwix)
Shakkatsun reagiu a Gwix por um tópico no fórum
Realmente, a Zanknore antiga possuía apenas 1 estátua dwarf no templo, e pelo fato de ser sujo o pessoal acha que isso é característico. RPGísticamente falando (nisso eu me baseio em LOTR, porque o Tibia também tem muita ligação com o LOTR = Lord of the Rings) Os anões possuem construções lindas e grandiosas, porém rústicas, isso que eu quis incorporar na nova Zanknore, incrementando gemas e etc, as paredes escolhidas não foram escolhidas à toa, nelas tem escrituras rúnicas dos anões (Onde Tolkien se inspirou no alfabeto Futhark - Viking). Na verdade acho que o pessoal não gostou muito da entrada e achou o mapa todo seria daquela forma. Vou postar um mapa de uma forma diferente hoje1 ponto -
[elf bot] Hotkey Para Resetar
TioItachi reagiu a MatheusGlad por um tópico no fórum
auto 200 if [$level >= 717217] say '!reborn'1 ponto -
[Resolvido] [Pedido] Spell Pokemon (Outrage)
dindalluiz reagiu a zipter98 por uma questão
Já que você não mencionou a base utilizada, irei supor que é PDA. data/lib/pokemon moves.lua: elseif spell == "Outrage" then local config = { outfit = { --["pokemon_name"] = outfit, ["Salamence"] = xxx, }, AOE = { times = 2, --Quantas vezes o golpe AOE será usado. interval = 3000, --Intervalo de tempo, em milésimos de segundo, entre cada golpe AOE. combat = DRAGONDAMAGE, --Elemento. spell = { --Uma tabela deverá ser configurada com a área e efeito da parte com socos, e a outra com a parte do efeito do Draco Meteor. {area = OutrageArea1, effect = xxx}, --{area = área do dano AOE, effect = efeito} {area = OutrageArea2, effect = xxx} }, } } local function doOutrage(cid, times) if not isCreature(cid) then return true end for i = 1, #config.AOE.spell do doMoveInArea2(cid, config.AOE.spell[i].effect, config.AOE.spell[i].area, config.AOE.combat, min, max, spell) end times = times - 1 if times <= 0 then local rounds = math.random(4, 7) rounds = rounds + math.floor(getPokemonLevel(cid) / 35) local ret = {} ret.id = cid ret.cd = rounds ret.check = getPlayerStorageValue(cid, conds["Confusion"]) ret.cond = "Confusion" doCondition2(ret) return true end addEvent(doOutrage, config.AOE.interval, cid, times) end local ret = {} ret.id = cid ret.cd = config.AOE.interval / 1000 * config.AOE.times ret.eff = 0 ret.check = 0 ret.buff = spell ret.first = true doCondition2(ret) doSetCreatureOutfit(cid, {lookType = config.outfit[getCreatureName(cid)]}, config.AOE.interval * config.AOE.times) addEvent(doOutrage, config.AOE.interval, cid, config.AOE.times) areas.lua: OutrageArea1 = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, } OutrageArea2 = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, } newStatusSyst.lua, abaixo de: if buff == "Strafe" or buff == "Agility" then setPlayerStorageValue(cid, 374896, 1) --velo atk --alterado v1.6 doRaiseStatus(cid, 0, 0, 100, a) coloque: elseif buff == "Outrage" then doRaiseStatus(cid, 0, 1.4, 0, a)1 ponto -
Tree Cut System
Luga03 reagiu a IoriOtserv por um tópico no fórum
Boa Tarde Galera, Hoje venho postar um sistema adaptado que eu desenvolvi. Basicamente eu peguei o sistema de Minning existente no servidor postado pelo Vmspk (http://www.xtibia.co...60-azeroth-rpg/) e modifiquei para corte de árvores ao invés de minério de stones. Bom, vamos ao que interessa: Para quê serve este sistema? R: Ele é um sistema secundário voltado para enfatizar o RPG de servidores, no meu servidor eu o utilizo para obtenção de material para forja. Utilize sua criatividade para implementá-lo no seu servidor. Ele funciona em quais versões de Open Tibia? R: Só testei na versão 9.6 até agora, peço que vocês postem caso estejam conseguindo utiliza-lo em outras versões. primeiramente você precisa adicionar um arquivo chamado cutsystem.lua com o seguinte dentro: local configs = { sign = {{level = {1,99}, quant = {1,2}, percent = 25}, {level = {100,120}, quant = {1,5}, percent = 35}, {level = {121,130}, quant = {1,7}, percent = 45}, {level = {131,140}, quant = {1,8}, percent = 65}, {level = {141,149}, quant = {1,9}, percent = 70}, {level = {150}, quant = {1,10}, percent = 100}}, trees = {2708, 2768, 2767, 2702, 2785, 2700, 2707, 2711, 2706, 2707, 2705, 2719, 7024, 5156, 5157, 2697, 2698, 2701, 2702, 2703, 2704, 2707, 2712, 2718, 2719, 2720, 2709, 2710, 2722, 2725, 2726, 2770, 2786, 4006, 4007, 4008, 4009, 4010, 7020, 7021, 7022, 7023}, wood = {{5901, 'all'}}, tree_delay = 5, --[em minutos MaxLevel = 150, breakChance = 0 } --END Configs-- function onUse(cid, item, fromPosition, itemEx, toPosition, onUse) local STORAGE_SKILL_LEVEL = 20000 local STORAGE_SKILL_TRY = 20001 local skillLevel = getPlayerStorageValue(cid,STORAGE_SKILL_LEVEL) local skillTry = getPlayerStorageValue(cid,STORAGE_SKILL_TRY) local objeto2 = getThingFromPos(toPosition) local player = (cid) if skillLevel == -1 then setPlayerStorageValue(cid,STORAGE_SKILL_LEVEL,1) end for Q = 1, #configs.sign do if configs.sign[Q].level[2] == nil then configs.sign[Q].level[2] = configs.sign[Q].level[1] end if skillLevel >= configs.sign[Q].level[1] and skillLevel <= configs.sign[Q].level[2] then quant = math.random(configs.sign[Q].quant[1],configs.sign[Q].quant[2]) percent = configs.sign[Q].percent break end end for i = 1, #configs.trees do if objeto2.itemid == configs.trees[i] then if math.random(1,100) <= configs.breakChance then doPlayerSendCancel(cid,"Your axe has broke") doSendMagicEffect(toPosition, 3) doRemoveItem(item.uid,1) doPlayerSay(cid,"Broke!",1) return true else if math.random(1,100) <= percent then possible_wood = {{},{}} for h = 1, #configs.wood do if configs.wood[h][2] == objeto2.itemid then possible_wood[1][#possible_wood[1]+1] = configs.wood[h][1] else if configs.wood[h][2] == 'all' then possible_wood[2][#possible_wood[2]+1] = configs.wood[h][1] end end end if possible_wood[1][1] == nil and possible_wood[2][1] == nil then doPlayerSay(cid,"This tree can not be chopped.",1) elseif possible_wood[1][1] ~= nil then doPlayerAddItem(cid,possible_wood[1][math.random(1,#possible_wood[1])],quant) elseif possible_wood[1][1] == nil and possible_wood[2][1] ~= nil then doPlayerAddItem(cid,possible_wood[2][math.random(1,#possible_wood[2])],quant) end if possible_wood[1][1] ~= nil or possible_wood[2][1] ~= nil then if skillTry >= 0 then setPlayerStorageValue(cid,STORAGE_SKILL_TRY,skillTry + 1) else setPlayerStorageValue(cid,STORAGE_SKILL_TRY,1) end doPlayerSay(cid,"I got "..quant.." woods.",1) doItemSetAttribute(objeto2.uid, "name", "remains of wood ore") doSendMagicEffect(toPosition, 3) addEvent(doTreeReturn,configs.tree_delay * 1000/60,toPosition,objeto2.itemid) doTransformItem(objeto2.uid, 8786) break end else doPlayerSendCancel(cid,"You destroyed the tree...") doSendMagicEffect(toPosition, 3) doItemSetAttribute(objeto2.uid, "name", "remains of wood ore") doPlayerSay(cid,"I broke the tree!",1) addEvent(doTreeReturn,configs.tree_delay * 1000/60,toPosition,objeto2.itemid) doTransformItem(objeto2.uid, 8785) break end end else doPlayerSendCancel(cid,"I can only chop trees") end end if skillTry >= ((skillLevel+1)*3) then if skillLevel == configs.MaxLevel then doPlayerSay(cid,"I got the max level in tree cutting.",1) setPlayerStorageValue(cid,STORAGE_SKILL_TRY,0) else setPlayerStorageValue(cid,STORAGE_SKILL_LEVEL,skillLevel + 1) setPlayerStorageValue(cid,STORAGE_SKILL_TRY,0) doPlayerSay(cid,"I advanced from level ".. skillLevel .." to level ".. skillLevel + 1 .." in chopping skill.",1) doPlayerSay(cid,"LEVEL UP!",1) end end end function doTreeReturn(itemposition,oldid) local pos = getThingfromPos(itemposition) doTransformItem(pos.uid,oldid) doSetItemText(pos.uid, getItemNameById(oldid)) doSendMagicEffect(itemposition,math.random(28,30)) end Para editar as configurações do sistema basta modificar as primeiras informações da tabela: sign = {{level = {(do skill)1,(até o skill)99}, quant(quanto você pode conseguir) = {1,2}, percent(chance de dar certo) = 25}, trees(os id's das árvores "cortáveis") = {2708, 2768, 2767, 2702, 2785, 2700, 2707, 2711, 2706, 2707, 2705, 2719, 7024, 5156, 5157, 2697, 2698, 2701, 2702, 2703, 2704, 2707, 2712, 2718, 2719, 2720, 2709, 2710, 2722, 2725, 2726, 2770, 2786, 4006, 4007, 4008, 4009, 4010, 7020, 7021, 7022, 7023}, wood = {{5901, 'all'}}, (troque o id 5901 pelo id do item que você quer dar como recompensa) tree_delay = 5, --[em minutos (tempo que as árvores vão demorar para crescer novamente depois de cortadas) MaxLevel = 150, (só modifique caso você aumentar o level máximo na tabela "sign") breakChance = 0 (a chance em % que o seu item - no meu caso o Axe - tem de quebrar quando usado na árvore) agora vá no seu arquivo actions.xml e adione a seguinte tag: <!-- Tree Cut--> <action itemid="2386" script="cutsystem.lua" /> 2386= Este é o ID do item Axe, caso queira trocar, fique à vontade. é isso aih pessoal... esse é o sisteminha que eu adaptei para meu servidor, espero que seja útil para alguém, abraços.1 ponto -
Não se esqueça de editar a storage do script pra storage do seu reset, e também a quantia de reset pra passar. Vá em data/movemments/scripts/resettile.lua, e deixe assim: function onStepIn(cid, item, position, fromPosition) local reset_storage = 123 -- coloque o storage do seu sistema de reset local quant_reset = 3 -- quantidade de resets para poder passar if (getPlayerStorageValue(cid, reset_storage) < quant_reset) then doTeleportThing(cid, fromPosition, false) doSendMagicEffect(position, CONST_ME_MAGIC_BLUE) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Somente players com ".. (quant_reset) .." ou mais podem passar.") end return TRUE end Em data/movemments/movemments.xml, adicione: <movevent type="StepIn" actionid="4563" event="script" value="resettile.lua"/> No tile que só vai poder passar com x reset, você poem a ACTION ID 4563.1 ponto