Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 07/02/15 em todas áreas
-
Fruit Picking Introdução: é um sistema simples, consiste em você pode colher a fruta da arvore e ela crescer depois de um tempo de novo. Instalar o script: em action/script crie: FruitHarvesting.lua adicione: -- Do not remove the credits -- -- [ACTION] Fruit Harvesting -- -- Developed by Rigby -- -- Especially for the Xtibia.com -- local config = { -- [ID_DA_ARVORE] = {FRUTA, QUANTIDADE{minimo, maximo}, ID_DA_ARVORE_SEM_FRUTO, TEMPO_PARA_ÀRVORE_FICA_COM_FRUTO} [5157] = {fruit = 5097, quantity = {0,1}, treeWithoutFruit = 5156, timeToGrow = 5}, [4006] = {fruit = 2675, quantity = {0,3}, treeWithoutFruit = 4008, timeToGrow = 20}, [5094] = {fruit = 2676, quantity = {3,6}, treeWithoutFruit = 5092, timeToGrow = 30}, [5096] = {fruit = 2678, quantity = {2,7}, treeWithoutFruit = 2726, timeToGrow = 70}, } function onUse(cid, item, fromPosition, itemEx, toPosition) for i, k in pairs(config) do if (isInArray(i, item.itemid) == true) then random = math.random(k.quantity[1],k.quantity[2]) doTransformItem(item.uid, k.treeWithoutFruit, 1) doPlayerAddItem(cid,k.fruit,random) addEvent(function() doTransformItem(getThingFromPos(toPosition).uid, i) end, k.timeToGrow * 1000) if random > 0 then doPlayerSendTextMessage(cid,27,"Você pego "..random.." "..getItemNameById(k.fruit).."!") else doPlayerSendTextMessage(cid,27,"Àrvore não deu nenhum fruto!") end end end return true end em action/action.xml adicione a tag: <action itemid="5157;4006;5094;5096" event="script" value="FruitHarvesting.lua"/> Se você adicionar mais arvore não esqueça de adiciona o id na tag também.4 pontos
-
Abrindo site
RigBy e um outro reagiu a VictorWEBMaster por um tópico no fórum
@RigBy, aconselho procurar algum tutorial para que você possa entender melhor a respeito de como configurar o banco de dados no config.lua do servidor. Seria mais fácil, prático e instrutivo você procurarpor tutoriais...2 pontos -
Abrindo site
Piabeta Kun e um outro reagiu a VictorWEBMaster por um tópico no fórum
Primeiro de tudo você deve checar se a versão do website é compatível com o servidor utilizado, é eminente os erros quando nao há compatibilidade, se você está utilizando tfs 1.0 ~ 1.2 este website é funcional, versões abaixo como TFS 0.3.4 a 0.4 não funcionarão, que são servidores de versões 8.4 a 9.8x... Verifique o servidor que versão é utilizada pelo TFS Faça um check up de versão do website, para verificar se é compátivel. Me diga as versões, posso te ajudar. @Erro Basicamente o erro aparente é a falta de uma linha de encriptação das senhas no banco de dados por meio de configuração no config.lua. Veja se possui isso no config.lua passwordType = "sha1"2 pontos -
Base usada: PDA by Slicer, v1.9 Para quem não conhece o sistema de mega evoluções, recomendo acessar este link. A diferença é que a pedra (mega stone) não ocupa o espaço de um Held Item tier Y (visto que não são todos os servidores que possuem Held Itens). Instalação do sistema (atenção nos detalhes) data/lib: cooldown bar.lua: Troque o código da função getNewMoveTable(table, n) por este: function getNewMoveTable(table, n) if table == nil then return false end local moves = {table.move1, table.move2, table.move3, table.move4, table.move5, table.move6, table.move7, table.move8, table.move9, table.move10, table.move11, table.move12} local returnValue = moves if n then returnValue = moves[n] end return returnValueend No código da função doUpdateMoves(cid), troque o segundo: table.insert(ret, "n/n,") por: local mEvolveif not getCreatureName(summon):find("Mega") and getItemAttribute(getPlayerSlotItem(cid, 8).uid, "megaStone") then if not isInArray(ret, "Mega Evolution,") then table.insert(ret, "Mega Evolution,") mEvolve = true endendif not mEvolve then table.insert(ret, "n/n,")end Depois, em pokemon moves.lua: Troque: min = getSpecialAttack(cid) * table.f * 0.1 --alterado v1.6 por: min = getSpecialAttack(cid) * (table and table.f or 0) * 0.1 --alterado v1.6 Código da spell: elseif spell == "Mega Evolution" then local effect = xxx --Efeito de mega evolução. if isSummon(cid) then local pid = getCreatureMaster(cid) if isPlayer(pid) then local ball = getPlayerSlotItem(pid, 8).uid if ball > 0 then local attr = getItemAttribute(ball, "megaStone") if attr and megaEvolutions[attr] then local oldPosition, oldLookdir, health_percent_lost = getThingPos(cid), getCreatureLookDir(cid), (getCreatureMaxHealth(cid) - getCreatureHealth(cid)) * 100 / getCreatureMaxHealth(cid) doItemSetAttribute(ball, "poke", megaEvolutions[attr][2]) doSendMagicEffect(getThingPos(cid), effect) doRemoveCreature(cid) doSummonMonster(pid, megaEvolutions[attr][2]) local newPoke = getCreatureSummons(pid)[1] doTeleportThing(newPoke, oldPosition, false) doCreatureSetLookDir(newPoke, oldLookdir) adjustStatus(newPoke, ball, true, false) doCreatureAddHealth(newPoke, -(health_percent_lost * getCreatureMaxHealth(newPoke) / 100)) if useKpdoDlls then addEvent(doUpdateMoves, 5, pid) end end end end end Depois, em configuration.lua: megaEvolutions = { --[itemid] = {"poke_name", "mega_evolution"}, [11638] = {"Charizard", "Mega Charizard X"}, [11639] = {"Charizard", "Mega Charizard Y"},} Agora, em data/actions/scripts, código da mega stone: function onUse(cid, item) local mEvolution, ball = megaEvolutions[item.itemid], getPlayerSlotItem(cid, 8).uid if not mEvolution then return doPlayerSendCancel(cid, "Sorry, this isn't a mega stone.") elseif ball < 1 then return doPlayerSendCancel(cid, "Put a pokeball in the pokeball slot.") elseif #getCreatureSummons(cid) > 0 then return doPlayerSendCancel(cid, "Return your pokemon.") elseif getItemAttribute(ball, "poke") ~= mEvolution[1] then return doPlayerSendCancel(cid, "Put a pokeball with a(n) "..mEvolution[1].." in the pokeball slot.") elseif getItemAttribute(ball, "megaStone") then return doPlayerSendCancel(cid, "Your pokemon is already holding a mega stone.") end doItemSetAttribute(ball, "megaStone", item.itemid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Now your "..getItemAttribute(ball, "poke").." is holding a(n) "..getItemNameById(item.itemid)..".") doRemoveItem(item.uid) return trueend Depois, em goback.lua: Abaixo de: if not pokes[pokemon] then return trueend coloque: if pokemon:find("Mega") then local normalPoke = megaEvolutions[getItemAttribute(item.uid, "megaStone")][1] if normalPoke then doItemSetAttribute(item.uid, "poke", normalPoke) pokemon = normalPoke end end Depois, em data/creaturescripts/scripts, look.lua: Abaixo de: local boost = getItemAttribute(thing.uid, "boost") or 0 coloque: local extraInfo, megaStone = "", getItemAttribute(thing.uid, "megaStone")if megaStone then extraInfo = getItemNameById(megaStone) if pokename:find("Mega") then pokename = megaEvolutions[megaStone][1] endend Depois, acima do primeiro: doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, table.concat(str)) coloque: if extraInfo ~= "" then table.insert(str, "\nIt's holding a(n) "..extraInfo..".")end Já em data/talkactions/scripts, move1.lua: Abaixo de: function doAlertReady(cid, id, movename, n, cd) coloque: if movename == "Mega Evolution" then return true end Troque: if not move then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.") return true end por: if not move then local isMega = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "megaStone") if not isMega or name:find("Mega") then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.") return true end local moveTable, index = getNewMoveTable(movestable[name]), 0 for i = 1, 12 do if not moveTable[i] then index = i break end end if tonumber(it) ~= index then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.") return true end local needCds = true --Coloque false se o pokémon puder mega evoluir mesmo com spells em cooldown. if needCds then for i = 1, 12 do if getCD(getPlayerSlotItem(cid, 8).uid, "move"..i) > 0 then return doPlayerSendCancel(cid, "To mega evolve, all the spells of your pokemon need to be ready.") end end end move = {name = "Mega Evolution", level = 0, cd = 0, dist = 1, target = 0} end E troque: doCreatureSay(cid, ""..getPokeName(mypoke)..", "..msgs[math.random(#msgs)]..""..move.name.."!", TALKTYPE_SAY) por: local spellMessage = msgs[math.random(#msgs)]..""..move.name.."!"if move.name == "Mega Evolution" then spellMessage = "Mega Evolve!"enddoCreatureSay(cid, getPokeName(mypoke)..", "..spellMessage, TALKTYPE_SAY) Se não quiser que o "Mega" apareça no nome do pokémon, vá em data/lib, level system.lua: Acima de: if getItemAttribute(item, "nick") then nick = getItemAttribute(item, "nick")end coloque: if nick:find("Mega") then nick = nick:match("Mega (.*)") if not pokes[nick] then nick = nick:explode(" ")[1] end end Caso queiram que cada mega evolução tenha um clã específico: Em move1.lua, acima de: move = {name = "Mega Evolution", level = 0, cd = 0, dist = 1, target = 0, f = 0, t = "?"} coloque: local megaEvoClans = { --[mega_stone_id] = "clan_name", [91912] = "Volcanic", [91913] = "Seavell", --etc,}if megaEvoClans[isMega] then if getPlayerClanName(cid) ~= megaEvoClans[isMega] then return doPlayerSendCancel(cid, "You can't mega evolve this pokemon.") endend Finalizando o tópico após uma pequena reestruturação na indexação, gostaria de levantar algo que acredito ser bem claro: o sistema é cheio de detalhes, muitas vezes minuciosos. Um simples erro e bugs aparecem por toda parte. Se você encontrou algum, pelo menos uma das duas seguintes condições acontecem: Base DIFERENTE da usada. Peço desculpas, mas não pretendo adaptar o sistema para todas as bases diferentes que aparecerem. Se a base for a mesma, você com certeza errou em algum ponto da instalação. O sistema foi testado inúmeras vezes, não apenas por mim, e seu funcionamento foi seguidamente comprovado. Façam bom uso, invocadores.1 ponto
-
OtClient - Tutorial Básico #1
TkZeCo reagiu a BananaFight por um tópico no fórum
OtClient - Tutorial Básico #1 Aula 1 : Editando mod/Modules Bom galera, hoje eu vou ensinar vocês a como editar mod/Modules, e também como posiciona-los na janela. OBS: Quando eu falar Janela, estou me referindo aos objetos: MainWindow, Botton etc Passo 1 entendendo os arquivos Dentro da maioria das pasta no OtClient existirão 3 arquivos com as seguintes extensões: .lua.otmod.otui Cada uma dessas extensões executam um papel EXTREMAMENTE importante dentro do mod/module que você pretende criar, Mais será explicado mais para a frente, Nessa aula vamos mexer apenas no arquivo ".otui". Passo 2 Indentação Uma das coisas mais importante dentro dos arquivos ".otui" é a indentação, pois se você errar um espaçamento qualquer você pode estar 'bugando' todo o funcionamento da sua mod/module. Vou ensinar a vocês o modo certo de indentar seus códigos para que não tenham erros. MainWindowid: tutorialWindowsize: 80 80&save: true Dentro dos arquivos '.otui' só é permitido a indentação com a tecla "Espaço", Caso você tente usar "Tab" para indentar seu código ele vai dar erro e não irá funcionar. A indentação deve ser feita com apenas 2 espaços, e sempre seguindo a ordem do item que você ta criando. Exemplo: MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Como o Botão 'Button1' vai ficar dentro da janela ' tutorialWindow', ele tem que ficar a uma distancia de 2 espaços da janela 'MainWindow', Caso eu quebre esse espaçamento provavelmente poderei ter bugs na hora de abrir esse mod/module dentro do client. Outra coisa para tomar cuidado é quando for dar linha para adicionar outra janela, nessa linha em que separa uma janela não pode conter nem um espaço e nenhum comando. Exemplo: Certo MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Errado MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Vocês não conseguem ver a diferença, mais tente selecionar os dois códigos que vão entender melhor, o que eu falei. Agora a organização e edição de cada janela dentro do arquivo '.otui' deve seguir o mesmo principio de 2 espaços de distancia. Exemplo: Certo MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Errado MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 E também esta Errado desta forma MainWindowid: tutorialWindowsize: 80 80&save: trueButtonid: Button1anchors.top: parent.topanchors.right: parent.rightmargin-left: 5 Como o botão vai aparecer dentro da janela 'MainWindow' ele tem que ficar a 2 espaçamento dela pois se eu deixar os 2 na mesma posição é como se eu estivesse dizendo ao script que são duas janelas separadas e o botton vai aparecer por conta própria quando eu executar o mod/module. Passo 3 conhecendo as janelas Existem diversos modos de se criar uma janela onde vai aparecer vários botoes textos e etc, Mais sempre vai ter uma janela que será a matriz de todos, onde todos deverão aparecer, que no nosso exemplo é : MainWindowid: tutorialWindowsize: 80 80&save: true Esse código é nossa janela principal, É nela que vai aparecer tudo que queremos mostrar com no script, Agora vou mostrar o que cada função que tem dentro de MainWindow faz. MainWindowid: esse é o ID do MainWindow, Supondo que tenham 2 MainWindow, é com esse id que vamos diferencia-lassize: aqui é onde configuramos a largura e altura da janela, nessesariamente nessa ordem&save: isso fica para as próximas aulas Não precisamos usar necessariamente size para mostrar o tamanho ou largura da janela, podemos utilizar por exemplo : width: 80height: 80 Esses 2 códigos podem ser utilizados no lugar de size e farão exatamente a mesma coisa. Caso você tenha editado ou criado algum mod/modules para testar esses códigos que mostrei acima, percebeu que na janela não aparece nome e nem nada do gênero e é isso que irei mostrar agora. !text: tr('Texto') - Essa função adiciona o texto na janela em que você adicionar esta linhaicon: img.png - Esta função pega a sua imagem e usa ela de icone para a janela ( neste caso a imagem tem que estar na mesma pasta que o arquivo '.otui', e isso só irá funcionar dependendo do tipo da janela matriz, veremos em outros tutoriais.) Com esses dois Código você consegue personalizar a janela onde irão aparecer os botoes, textos etc que você pretende fazer. Exemplo: MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: true Agora vamos começar a criar botoes, escrever textos e etc. Vamos começar adicionando uma Label que vai mostrar o texto 'Olá Xtibia'. MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftmargin-top: 5margin-left: 5 Como vocês podem ver apareceram algumas funções novas, que são elas : anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightanchors.bottom: parent.bottomanchors.top: prev.topanchors.left: prev.leftanchors.right: prev.rightanchors.bottom: prev.bottommargin-top: 5margin-left: 5margin-right: 5margin-bottom: 5 Com essas funões nós determinamos onde cada item da nossa janela vai ficar. Entendendo as novas funções anchors.top: parent.top Com a linha 'anchors.top:' estamos dizendo que a posição do meu item vai ser definida para cima, agora adicionando 'parent.top' estamos dizendo que a posição do meu item deve se Colada com começo da Janela, e isso segue para left, right, bottom também. agora se no lugar de 'parent.top' eu usar 'prev.top' eu estou dizendo que meu item vai ficar colado com a parte de cima do item que tem encima, Confuso eu sei mais vou dar um exemplo: MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.left Ali no script acima eu estou mandando a Label1 ficar colada com a borda de cima da janela principal, e a esquerda, Já na Label2, eu estou mando ela ficar colada com a Label1 ( pois a label1 que esta encima ) e também ficar colada com a borda da janela principal. Isso se aplica a todos os lados, se eu usar prev.left, eu vou estar dizendo que a label2 tem que ficar exatamente do lado esquerdo da label1. As funções 'margin-top: 5' vão fazer com que meu item fique com a distancia de 5 pixel ( Não tenho certeza se são pixels ) do item que esta acima MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5 Nesse Exemplo eu fiz a label2 ficar a 5 pixel abaixo da Label1, e isso é a mesma coisa se eu ultilizar left, right, bottom eu vou pegar uma distancia do que estiver do lado do meu item ou embaixo etc. Mais agora nós não precisamos nos prender a ficar somente com parent, e prev na hora de criar um item. podemos utilizar o id de um item como referencia de onde deve ficar meu item, como no exemplo : MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: parent.topanchors.left: Label1.left Nesse Exemplo eu fiz com que a Label3 ficasse a esquerda da Label1, e grudada a margem da janela principal, mais eu também poderia fazer ela ficar embaixo da Label1, e grudada ao lado direito da margem da janela principal. MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.topanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.topanchors.right: parent.right Mais caso você for testar isso vai perceber que o Label2 vai ficar encima do Label1 e ao invés do Label3 ficar embaixo do Label1 ele vai ficar do lado, Para corrigir esses pequenos erros você pode juntar códigos como no exemplo : MainWindowid: tutorialWindow!text: tr('Tutorial Window')size: 80 80&save: trueLabelid: Label1!text: tr('Olá Xtibia')anchors.top: parent.topanchors.left: parent.leftLabelid: Label2!text: tr('Xtibia o melhor')anchors.top: prev.bottomanchors.left: parent.leftmargin-top: 5Labelid: Label3!text: tr('Xtibia OtClient')anchors.top: Label1.bottomanchors.right: parent.right Pelo Simples fato de eu ter trocado top por bottom agora o script sabe que a Label2 tem que ficar no fim da Label1 e o mesmo para a Label3, e por isso usamos margin, para deixa uma distancia entre cada item, e para ficar mais organizado. Bom acho que é isso, Caso eu lembre de algo relevante estarei editando e adicionando mais coisas, Espero que gostem e quais quer DUVIDAS relacionadas AO TÓPICO é só fazer um comentário aqui embaixo que estarei respondendo. @Edit, Infelizmente o Xtibia Quebrou a indentação, mais lembre-se é sempre 2 espaços.1 ponto -
RME [customizado, suporta arquivos extendidos e transparência]
Gogetasaya reagiu a EdMignari por um tópico no fórum
Remere's Map Editor dispensa apresentação. É o editor mais usado no mundo Open Tibia. Esta versão é uma compilação customizada para suportar arquivos estendidos e transparência. Versões Suportadas: 7.6 - 10.37 Download: Visual C++ Redistributable Packages (Instalação Necessária) Remere's Map Editor Scan Notas: 1- Não tem suporte para Windows XP. 2- Para habilitar a opção estendido ou transparência, vá ao menu File > Preferences > Client Version e selecione as opções extended e/ou transparency. Se selecionadas, não será possível abrir arquivos "normais". 3- O scan acusou um arquivo suspeito, no entanto eu usei o mesmo arquivo ( archive.dll ) usado pelo Remere em seu repositório. Créditos: Esses Caras Baxnie (Suporte para arquivos estendidos e transparência) EdMignari (Adaptação e compilação)1 ponto -
Day & Night
Administrador reagiu a JoaozinhoNA por um tópico no fórum
Day & Night É uma uma função que faz com que o jogo fique de Dia ou Noite, ilusórios (ou seja, o jogo não vai estar, mas ele vai apresentar que está, momentâneo [Até logout]). Eu criei essa função porque necessitava tirar SSs e precisava da luz da noite, esse foi o único motivo de ter criado essa função... então, não aconselho a utilizarem isso se não for dessa maneira, porque... as horas do jogo não vão mudar, é ilusório. [Não tive motivos para criar dessa maneira. ] Vamos lá! Primeiramente, adicione no final de game.cpp: void Game::setWorldTime(bool type, Player* player) { LightInfo lightInfo; if(!type) { lightInfo.level = LIGHT_LEVEL_NIGHT; } else { lightInfo.level = LIGHT_LEVEL_DAY; } lightInfo.color = 0xD7; player->sendWorldLight(lightInfo); } Em game.h, antes de: void setWorldType(WorldType_t type) {worldType = type;} Adicione: void setWorldTime(bool type, Player* player); Em luascript.cpp, antes de: int32_t LuaScriptInterface::luaGetItemAttribute(lua_State* L) Adicione: int32_t LuaScriptInterface::luaSetWorldState(lua_State* L) { bool type = popBoolean(L); ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); if(player) { g_game.setWorldTime(type, player); lua_pushnumber(L, true); return 1; } lua_pushnumber(L, false); return 1; } Ainda em luascript.cpp, antes de: //getItemAttribute(uid, key) Adicione: //setWorldState(uid, state = false) lua_register(m_luaState, "setWorldState", LuaScriptInterface::luaSetWorldState); E por último em luascript.h, antes de: static int32_t luaGetItemAttribute(lua_State* L); Adicione: static int32_t luaSetWorldState(lua_State* L); Como usar? function onSay(cid, words, param) for _, pid in pairs(getPlayersOnline()) do setWorldState(pid, false) end return true end function onSay(cid, words, param) if words == "/night" then setWorldState(cid, false) elseif words == "/day" then setWorldState(cid, true) end return true end Tópico referente à: http://www.xtibia.com/forum/topic/231827-doacoes-fto/1 ponto -
OUTFITS Atributos e Configurações Olá, pessoal. Muitas pessoas não sabem, mas você pode adicionar vários bônus às outfits diretamente pelo outfits.xml, sem precisar de nenhum creaturescript que eventualmente possa dar lag em um servidor com muitos jogadores. Com este tutorial, você aprenderá a configurar vários tipos de bônus e até especificar se são necessários addons para ativar esses bônus. Para começar, vou colar abaixo o conteúdo de um outfits.xml do The Forgotten Server trunk.r3884 (0.4.0), vamos trabalhar em cima dele: <?xml version="1.0"?> <outfits> <outfit id="1"> <list gender="0" lookType="136" name="Citizen"/> <list gender="1" lookType="128" name="Citizen"/> </outfit> <outfit id="2"> <list gender="0" lookType="137" name="Hunter"/> <list gender="1" lookType="129" name="Hunter"/> </outfit> <outfit id="3"> <list gender="0" lookType="138" name="Mage"/> <list gender="1" lookType="130" name="Mage"/> </outfit> <outfit id="4"> <list gender="0" lookType="139" name="Knight"/> <list gender="1" lookType="131" name="Knight"/> </outfit> <outfit id="5" premium="yes"> <list gender="0" lookType="140" name="Noblewoman"/> <list gender="1" lookType="132" name="Nobleman"/> </outfit> <outfit id="6" premium="yes"> <list gender="0" lookType="141" name="Summoner"/> <list gender="1" lookType="133" name="Summoner"/> </outfit> <outfit id="7" premium="yes"> <list gender="0" lookType="142" name="Warrior"/> <list gender="1" lookType="134" name="Warrior"/> </outfit> <outfit id="8" premium="yes"> <list gender="0" lookType="147" name="Barbarian"/> <list gender="1" lookType="143" name="Barbarian"/> </outfit> <outfit id="9" premium="yes"> <list gender="0" lookType="148" name="Druid"/> <list gender="1" lookType="144" name="Druid"/> </outfit> <outfit id="10" premium="yes"> <list gender="0" lookType="149" name="Wizard"/> <list gender="1" lookType="145" name="Wizard"/> </outfit> <outfit id="11" premium="yes"> <list gender="0" lookType="150" name="Oriental"/> <list gender="1" lookType="146" name="Oriental"/> </outfit> <outfit id="12" premium="yes" default="0"> <list gender="0" lookType="155" name="Pirate"/> <list gender="1" lookType="151" name="Pirate"/> </outfit> <outfit id="13" premium="yes" default="0"> <list gender="0" lookType="156" name="Assassin"/> <list gender="1" lookType="152" name="Assassin"/> </outfit> <outfit id="14" premium="yes" default="0"> <list gender="0" lookType="157" name="Beggar"/> <list gender="1" lookType="153" name="Beggar"/> </outfit> <outfit id="15" premium="yes" default="0"> <list gender="0" lookType="158" name="Shaman"/> <list gender="1" lookType="154" name="Shaman"/> </outfit> <outfit id="16" premium="yes" default="0"> <list gender="0" lookType="252" name="Norsewoman"/> <list gender="1" lookType="251" name="Norseman"/> </outfit> <outfit id="17" premium="yes" default="0"> <list gender="0" lookType="269" name="Nightmare"/> <list gender="1" lookType="268" name="Nightmare"/> </outfit> <outfit id="18" premium="yes" default="0"> <list gender="0" lookType="270" name="Jester"/> <list gender="1" lookType="273" name="Jester"/> </outfit> <outfit id="19" premium="yes" default="0"> <list gender="0" lookType="279" name="Brotherhood"/> <list gender="1" lookType="278" name="Brotherhood"/> </outfit> <outfit id="20" premium="yes" default="0"> <list gender="0" lookType="288" name="Demonhunter"/> <list gender="1" lookType="289" name="Demonhunter"/> </outfit> <outfit id="21" premium="yes" default="0"> <list gender="0" lookType="324" name="Yalaharian"/> <list gender="1" lookType="325" name="Yalaharian"/> </outfit> <outfit id="22" default="0"> <list gender="0" lookType="336" name="Warmaster"/> <list gender="1" lookType="335" name="Warmaster"/> </outfit> <outfit id="23" premium="yes" default="0"> <list gender="0" lookType="366" name="Wayfarer"/> <list gender="1" lookType="367" name="Wayfarer"/> </outfit> <outfit id="24" premium="yes" default="0"> <list gender="0" lookType="329" name="Wedding"/> <list gender="1" lookType="328" name="Wedding"/> </outfit> </outfits> [/code] [font=verdana,geneva,sans-serif]Existem diferentes tipos de atributos que você pode colocar na sua outfit, por exemplo, você pode colocar para quando um jogador estiver usando[b] X[/b] outfit, ele receba uma certa chance de refletir danos de um certo elemento. Vamos aprender abaixo a configuração de atributos do jogador.[/font] [font=verdana,geneva,sans-serif][hr][/font] [font=verdana,geneva,sans-serif]Para configurar atributos é muito simples, destacarei a outfit [b]Citizen[/b] para esse exemplo:[/font] <outfit id="1"> <list gender="0" lookType="136" name="Citizen"/> <list gender="1" lookType="128" name="Citizen"/> </outfit> Suponhamos que eu queira que quando um jogador estiver usando a outfit Citizen, ele receba speed +10 e recupere 30 de HP a cada 5 segundos, basta adicionar isso: <outfit id="1"> <list gender="0" lookType="136" name="Citizen" healthGain="30" healthTicks="5" speed="10" /> <list gender="1" lookType="128" name="Citizen" healthGain="30" healthTicks="5" speed="10" /> </outfit> Você pode diferenciar os tipos de bônus primários pelo sexo do jogador. Os bônus primários disponíveis são estes abaixo: manaShield invisible healthGain healthTicks manaGain manaTicks speed Agora existem bônus secundários que é necessária uma pequena edição na estrutura da configuração da outfit, vejamos abaixo: <outfit id="1"> <list gender="0" lookType="136" name="Citizen"/> <list gender="1" lookType="128" name="Citizen"/> </outfit> Estes bônus secundários variam desde pontos fixos em skills até chance de refletir algo ou absorver. Só que para que eles funcionem corretamente, você precisa "abrir" a configuração da outfit. Por exemplo, a outfit Citizen nos dará +50 de HPmáx e +1 em todas as skills de combate corporal. Vejamos: <outfit id="1"> <list gender="0" lookType="136" name="Citizen"> <stats maxHealth="50"/> <skills melee="1"/> </list> <list gender="1" lookType="128" name="Citizen"> <stats maxHealth="50"/> <skills melee="1"/> </list> </outfit> Veja que literalmente eu abri a outfit Citizen em sub-listas declarando atributos diferentes para elas, segue abaixo uma pequena lista de cada atributo e em que sub-lista ele deve ser declarado: stats maxHealth maxMana soul level magLevel || magicLevel maxHealthPercent maxManaPercent soulPercent levelPercent magLevelPercent || magicLevelPercent skills fist club sword axe distance || dist shielding || shield fishing || fish melee weapon fistPercent clubPercent swordPercent axePercent distancePercent || distPercent shieldingPercent || shieldPercent fishingPercent || fishPercent meleePercent weaponPercent || weaponsPercent Lembra que no começo desse tutorial, eu disse que era possível configurar chance de reflexão e absorção para as outfits? Pois é, é possível sim. Vamos pegar um exemplo diferente agora, a outfit Wizard. <outfit id="10" premium="yes"> <list gender="0" lookType="149" name="Wizard"/> <list gender="1" lookType="145" name="Wizard"/> </outfit> Vamos dizer que a outfit Wizard com addons completos dará a chance de 10% de refletir 25% do dano feito por elementos (Fire, Earth, Ice, Energy). Para fazer isso, é o mesmo esquema de stats e skills, só que o nome da sub-lista deve ser reflect ou absorb. Dependendo do que você quer que a outfit faça, refletir ou absorver. <outfit id="10" premium="yes"> <list gender="0" lookType="149" name="Wizard"> <reflect percentElements="25" chanceElements="10"/> </list> <list gender="1" lookType="145" name="Wizard"> <reflect percentElements="25" chanceElements="10"/> </list> </outfit> Veja abaixo a lista dos possíveis atributos para reflect e absorb: percentAll percentElements percentMagic percentEnergy percentFire percentPoison || percentEarth percentIce percentHoly percentDeath percentLifeDrain percentManaDrain percentDrown percentPhysical percentHealing percentUndefined chanceAll chanceElements chanceMagic chanceEnergy chanceFire chancePoison || chanceEarth chanceIce chanceHoly chanceDeath chanceLifeDrain chanceManaDrain chanceDrown chancePhysical chanceHealing chanceUndefined Por último, você pode definir quando esses bônus são dados, seja quando o jogador está utilizando o primeiro addon, o segundo, qualquer um dos dois ou ambos. O atributo para isso é requirement. <outfit id="10" premium="yes"> <list gender="0" lookType="149" name="Wizard" requirement="any"> <reflect percentElements="25" chanceElements="10"/> </list> <list gender="1" lookType="145" name="Wizard" requirement="any"> <reflect percentElements="25" chanceElements="10"/> </list> </outfit> first second any both Existem alguns atributos que manipulam se o jogador pode usar a outfit, o mais conhecido deles é o premium que só permite o uso da outfit a jogadores premium. Mas muitos não conheçam os atributos quest, storageId e storageValue que torna possível dar outfits em quests, igual acontece no Tibia. Para isso, pegaremos qualquer outfit. <outfit id="20" premium="yes" default="0"> <list gender="0" lookType="288" name="Demonhunter"/> <list gender="1" lookType="289" name="Demonhunter"/> </outfit> Quando você usa o atributo quest com o valor igual a uma storage do servidor, a outfit só poderá ser usada se a storage tiver valor igual a 1. Por exemplo: <outfit id="20" premium="yes" quest="2005" default="0"> <list gender="0" lookType="288" name="Demonhunter"/> <list gender="1" lookType="289" name="Demonhunter"/> </outfit> Se a storage 2005 tiver valor igual a 1, então eu poderei usar a outfit Demonhunter. Mas e se eu estou trabalhando com uma grande quest que o valor final da storage é 3 e não 1? Por isso que existem os atributos storageId e storageValue. <outfit id="20" premium="yes" storageId="2005" storageValue="3" default="0"> <list gender="0" lookType="288" name="Demonhunter"/> <list gender="1" lookType="289" name="Demonhunter"/> </outfit> Bom, isso é tudo. Qualquer dúvida não deixe de postar no tópico. Abração \o/1 ponto
-
function Player.setExhaustion(self, value, time) return self:setStorageValue(value, time + os.time()) end function Player.getExhaustion(self, value) local storage = self:getStorageValue(value) if storage <= 0 then return 0 end return storage - os.time() end Exemplo de uso: function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey) if player:getExhaustion(1350) <= 0 then player:setExhaustion(1350, 10) else print('Exausted! '..player:getExhaustion(1350)..' segundos restantes.') end return true end Créditos: Printer1 ponto
-
[TUTORIAIS] Para pokemon (Bases antigas)
jeanflamengo reagiu a JonatasLucasf por um tópico no fórum
Bom á muito tempo, muitas pessoas procuram tutoriais para pokemon dash, erondino, entre outras bases antigas, de como adicionar pokemons, colocar para evoluir, adicionar fly, ride, surf, criar spells, adicionar attacks aos pokemons etc. Irei fazer este tutorial justamente para quem tanto procura esse tipo de coisa e quer ingressar em uma coisa séria! Aviso! (É trabalhoso e exige dedicação e atenção) ( ͡° ͜ʖ ͡°) Tutorial n° 1 (Como adicionar novos pokemons) Bom como em todos os servidores é obrigatório ter o xml do pokemon e o seu registro na pasta monster. (Pularei a parte da monster...) Para adicionar um novo pokemon ao caught "Catch" Siga as imagens: Como exemplo de adição utilizarei o pokemon Salamence. Em data/actions/scripts/catch.lua SE AS IMAGENS FICAREM PEQUENAS NO TÓPICO BASTA CLICAR NAS MESMAS! Imagem: Após adicioná-lo ai ele já poderá ser capturado, mas calma. Depois de tê-lo posto em catch.lua você precisa colocá-lo no goback.lua localizado na mesma pasta. Imagem: Todo novo pokemon precisa de Dex e moves, e sim é preciso criar uma dex.. Para criar a dex do novo pokemon você vai em data/pokedex Crie um arquivo .txt para o exemplo de pokemon usado criarei Salamence.txt Mas para que ele seja reconhecido na pokedex vá em data/lib/pokeLib.lua, abra e procure por "newpokedex", siga ao final até o ultimo pokemon e siga a imagem.. Pronto agora seu pokemon tem dex e pode ser capturado, Agora só falta os moves.. Para adicionar os moves em seu pokemon você precisará de paciência e principalmente VONTADE! Vá em data/talkactions/scripts/move1, move2, move3 etc.. Eu irei mostrar somente o move 1, pois para add move 2, move 3 até move 12 é só ir nos seguintes arquivos e ir adicionando igualmente á imagem: Para por portrait em um pokemon vá em data/movements/scripts/portrait.lua e siga. imagem: Após isso, seu pokemons terá catch, dex e moves e portrait determinados por você (Eu pessoalmente prefiro essa dificuldade por ser ajustável ao meu jeito tanto a dex quanto HP, força que ajuda no balanceamento). Agora você se pergunta Salamence tem fly como vou adicionar.. Fácil! Em data/actions/scripts/order.lua Para adicionar rock smash, dig, cut na mesma order.lua um pouco mais embaixo: Imagem: Para adicionar surf vá em data/movements/scripts/surf.lua e siga a imagem: Agora um exemplo de como criar novas magias: Spoiler function onCastSpell(cid, var) doCreatureSay(cid, "NOME DA MAGIA!", TALKTYPE_MONSTER) if getPlayerStorageValue(cid, 3) >= 1 then doSendAnimatedText(getThingPos(cid), "MISS", 215) setPlayerStorageValue(cid, 3, -1) return true end if getPlayerStorageValue(cid, 5) >= 1 then if math.random(1,100) <= 33 then doSendAnimatedText(getThingPos(cid), "SELF HIT", 180) if isPlayer(getCreatureTarget(cid)) then huah = getPlayerLevel(getCreatureTarget(cid)) else huah = getPlayerLevel(getCreatureMaster(getCreatureTarget(cid))) end local levels = huah doTargetCombatHealth(getCreatureTarget(cid), cid, COMBAT_PHYSICALDAMAGE, -(math.random((levels*3),(levels*5))), -((math.random((levels*3),(levels*5))+10)),3) return true end end local parameters = { cid = cid, var = var} if getCreatureName(cid) == "NomeDoPokemon" then --Pokemon que dá mais dano ao utilizá-la dmga = 350 --Damage "HIT" á mais do pokemon especial elseif getCreatureName(cid) == "NomeDoPokemon" then --Pokemon que dá mais dano ao utilizá-la dmga = 550 --Damage "HIT" á mais do pokemon especial end local dmg = dmga local function fall(params) if isCreature(params.cid) then local pos = getThingPos(cid) pos.x = pos.x + math.random(-3,3) pos.y = pos.y + math.random(-3,3) local frompos = getThingPos(cid) frompos.x = pos.x - 7 frompos.y = pos.y - 6 doSendDistanceShoot(frompos, pos, 11) doAreaCombatHealth(cid, DamageDaMagia, pos, 0, -(dmg), -(dmg+45), 44) end end --Exemplo e spell Uma chuva de efeitos for rocks = 1, 20 do addEvent(fall, rocks*150, {cid = cid}) end for rocks = 1, 20 do addEvent(fall, rocks*110, {cid = cid}) end end Bom galera é isso, espero que curtam. iiBoooa! Espero que tenham força de vontade para fazer tudo rs' Créditos á mim pois fiz todo o tutorial! CRÉDITOS: DODOBY @DELETEM O AUTOR DO TÓPICO JÁ POSTOU1 ponto -
xTibia, o RETORNO!
Felipe Moraes reagiu a Administrador por um tópico no fórum
Sua comunidade de Otsev e Tibia está de volta! Bem vindos, caros amigos! O tão adorado e famoso fórum de Tibia e Otserv está online novamente! Depois de muitas discussões e (algumas?) tentativas, firmamos uma nova era no xTibia. Temos muitas expectativas e esperamos a colaboração de toda a comunidade. Isso vai ser um grande desafio para mim, darei meu máximo para agradar o público total, espero que, juntos, consigamos reviver por completo o que o xTibia já foi e tornar isso melhor. Atualizações • Mudanças visuais; • Reposição de conteúdo; • Reorganização de fóruns; • Revisão e reposição de equipe; • Concerto de falhas antigas no fórum; • Realocamento de tópicos com conteúdo danificado (500+) • Revisão de conteúdo da equipe; • Revisão e reformulação de cargos; • Revisão de permissões de membros. • Novos Icons! Novidades • Novo visual, agora prático. Removido excesso de poluição visual; • Conteúdos atuais (Servidores, mapas, sprites, etc...) disponíveis na comunidade; • Nova equipe (Staff); • Cargo Estágio, caso queira fazer parte da equipe ; • Volta dos projetos apoiados (Se você teve/quer ter um projeto apoiado, envie uma mensagem para *daniel@xtibia.com*). Feedback • Serão bem-vindos, quaisquer sugestões e criticas cabíveis na seção de atendimento (Feedback); • Ainda estamos trabalhando para melhorar o fórum, portanto, seja paciente; • Atendimento 24h ou retorno imediato da equipe; • Nova gestão em andamento, não toleramos nem toleraremos descumprimento das regras. Conteúdo • Os conteúdos do fórum foram atualizados e ainda estão sendo, se você é dono de algum tópico e deseja você mesmo postar reporte que a equipe atenderá. Staff • A equipe é composta por: Administrador; Moderador; Treinamento • @Daniel • • @Danihcv • @Krono • • @Tony •1 ponto -
Como aumentar o dano conforme os resets
RigBy reagiu a teteusinhu por uma questão
Muito obrigado RigBy! A questão Spell esta tinindo agora! Mas ainda gostaria de saber se realmente há uma resolução para o problema do ataque corpo a corpo. Vou esperar alguém se pronunciar sobre o assunto, caso não haja outra possibilidade, menos complicada que a sua listada irei dar por dúvida sanada =) E novamente, muito obrigado pela atenção e paciência RigBy. Edit: Aparentemente, não existe outro possibilidade mais prática e fácil em relação ao ataque corpo a corpo. Então irei dar por dúvida sanada. Caso alguém, por algum acaso, tenha alguma ideia ou uma solução, peço encarecidamente que me envie um PM.1 ponto -
Como aumentar o dano conforme os resets
teteusinhu reagiu a RigBy por uma questão
Adiciona essa função na lib/050-function, antes do ultimo end function getPlayerReset(cid) local qr = db.getResult("SELECT `reset` FROM `players` WHERE `id`= "..getPlayerGUID(cid)..";") rss = qr:getDataInt("reset", getPlayerGUID(cid)) if rss < 0 then rss = 0 end return rss end1 ponto -
Como aumentar o dano conforme os resets
teteusinhu reagiu a RigBy por uma questão
#CORPO A CORPO Para combate corpo a corpo "DO JEITO QUE EU TO PENSANDO", amenos que funcione apenas para player vai da um trabalho bem grande porque vai ter que registrar o evento em todos os monstro. #SPELL Nesse sistema a função que ver é quantidade de reset do player é essa: getPlayerReset(cid) Você teraque troca todas essas linhas de spells (pelomenos das magias que você quer que aumente). function onGetFormulaValues(cid, level, skill, attack, factor) local skillTotal, levelTotal = skill + attack, level / 5 return -(skillTotal * 1.5 + levelTotal), -(skillTotal * 2.5 + levelTotal) end setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") por essa function onGetFormulaValues(cid, level, skill, attack, factor) local reset = getPlayerReset(cid) local skillTotal, levelTotal = skill + attack, level / 5 return -(skillTotal * 1.5 + levelTotal)*(reset*0.1), -(skillTotal * 2.5 + levelTotal)*(reset*0.1) end setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") Eu so adicionei isso "local reset = getPlayerReset(cid)" "(reset*0.1)" só basta você alterar em "(reset*0.1)" o quanto você quer que aumente por reset.1 ponto -
LOGO PARA BLOG
JonatasLucasf reagiu a Kluivert por uma questão
Cara pra fala a verdade fiquei sem ideias para a capa; http://3.1m.yt/64tV2dqbL.png1 ponto -
LOGO PARA BLOG
JonatasLucasf reagiu a Kluivert por uma questão
Perfil; http://1.1m.yt/T-6nhMH2P.png Vou fazer a capa, depois posto aqui!1 ponto -
Summon não ganhar xp
SkyDarkyes reagiu a Bruno por uma questão
Olha man, esses erros não são sobre a alteração que eu fiz... Quando eu pedio que você alterasse a função, era ela toda e não apenas a primeira linha, pelo o que eu passei... Me passa o arquivo original, sem ser por code, apenas anexe no fórum ou em outro link para não haver problemas de formatação.1 ponto -
LOGO PARA BLOG
JonatasLucasf reagiu a Kluivert por uma questão
Se não gostar avise-me! http://1.1m.yt/ph9xQd5a6.png1 ponto -
muito bom, isso vai ser util para min futuramente1 ponto
-
colheita system
clebao666 reagiu a FlamesAdmin por um tópico no fórum
Ele quer um sistema baseado no do PxG, Pinkan Quest. O player tem item x, ele tem que colher frutas das árvores y, e nesse item x, tem um limite para não colher mais. Quanto as árvores, como ele disse, tem um tempo para ela voltar a dar frutos para colher novamente.1 ponto -
Mega Evolution System (PxG)
mariano1 reagiu a FlamesAdmin por um tópico no fórum
Editei meu post anterior. Dê uma olhada.1 ponto -
Mega Evolution System (PxG)
mariano1 reagiu a Shadow Phantom por um tópico no fórum
sim, o portrait é adicionado no item.xml também, tente se sair errado me chame na pm que eu te explico como adicionar corretamente.1 ponto -
Abra o creature.cpp e procure por: void Creature::addDamagePoints(Creature* attacker, int32_t damagePoints)E altera a função por esta: void Creature::addDamagePoints(Creature* attacker, int32_t damagePoints) { uint32_t attackerId = 0; if(attacker) { if(Creature* master = attacker->getMaster()) attacker = master; attackerId = attacker->getID(); } if(attacker->getPlayer()) { CountMap::iterator it = damageMap.find(attackerId); if(it != damageMap.end()) { it->second.ticks = OTSYS_TIME(); if(damagePoints > 0) it->second.total += damagePoints; } else damageMap[attackerId] = CountBlock_t(damagePoints); } if(damagePoints > 0) lastHitCreature = attackerId; } Resolvido, fechado e movido para pedidos e duvidas resolvidos.1 ponto
-
abrir bau para entrar em area
VitinhoMapp reagiu a RigBy por uma questão
Tutorial de como fazer uma quest. So basta você coloca a mesma storage no do piso, que ele so poderá entrar depois que fizer a quest. Pronto agora manda msg: local storage = 2313123 -- storage do bau function onStepIn(cid, item, position, fromPosition) if getPlayerStorageValue(cid, storage) == -1 then doTeleportThing(cid, fromPosition, false) doPlayerSendCancel(cid, "Somente vip pode entrar") else doPlayerSendCancel(cid, "Bem vindo") end return true end1 ponto -
Editar skills
SkyDarkyes reagiu a AdilsonHacker por uma questão
Sim, ai você vai encontrar todos como You advance level , etc1 ponto -
xTibia, o RETORNO!
Administrador reagiu a Yan Oliveira por um tópico no fórum
Fui saber antes de ontem que o Xtibia voltou, fico muito feliz, pois é um fórum que eu gosto muito e que tenho bastante identificação, pois no começo do ano estava chateado pois tava com vontade de ver algumas coisas e estava indisponivel... mas espero que permaneça por bastante tempo.1 ponto -
[Resolvido] Erro SQL
SkyDarkyes reagiu a AdilsonHacker por uma questão
Primeiro aba seu sqlitestudio vá na opção destacada na imagem abaixo em seguida cole os códigos dentro da aba abaixo que vai abrir e aperte F9. Pronto query executada.1 ponto -
Dominios .com -- HELP !
Piabeta Kun reagiu a Mudrock por um tópico no fórum
Acho que a duvida foi resolvida, caso contrario entre em contato comigo para que o tópico seja movido novamente @Tópico Movido para duvidas resolvidas1 ponto -
abrir bau para entrar em area
VitinhoMapp reagiu a RigBy por uma questão
So basta fazer um movement .lua local storage = 2313123 -- storage do bau function onStepIn(cid, item, position, fromPosition) if getPlayerStorageValue(cid, storage) == -1 then doTeleportThing(cid, fromPosition, false) end return true end .xml, tag <movevent type="StepIn" actionid="8752" event="script" value="nomedoscript.lua"/> so basta você adicionar o actionid (8752) no piso que só possa passar quem fez a quest.1 ponto -
Link Dat Editor no meu blog: http://tibiaolds.sytes.net/2015/03/dat-editor-by-black-demon-76-860.html1 ponto
-
Caderno de raphaelpdc
Lucasmml reagiu a raphaelpdc por um tópico no fórum
SteamPunk Drone: Animation (WIP):1 ponto -
Mega Evolution System (PxG)
CkShockz reagiu a Fuuin Fake por um tópico no fórum
PORRA CARA SEGURA MEU RP + CARA TU E MT FODA VELHO PARABENS <31 ponto -
OtClient - Tutorial Básico #2
Ryukiimaru reagiu a BananaFight por um tópico no fórum
OtClient - Tutorial Básico #2 Aula 2: Editando mod/Modules Parte 2 Hoje estarei me especificando mais com as janelas matrizes ou raízes como preferirem. Passo 1: Conhecendo as matrizes Irei mostrar 2 matrizes para vocês que são as únicas que vi até agora dentro dos códigos do OtClient (Isso não quer dizer que não possam existir novos modelos) Modelo 1 : MainWindowModelo 2: MiniWindow Cada um desses 2 modelos tem um jeito diferente para ler o código. No Modelo 1, ele é mais simples, Pois você só precisa mostrar a janela que irá ser criada dentro dele, como no exemplo: MainWindowid: tutorialWindow!text: tr('Tutorial')size: 150 150Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right Como podem ver é um jeito mais simples e pratico de fazer os códigos, Porem, esse tipo de janela não "Gruda" nos painéis direitos e nem esquerdos. Já no Modelo 2, as coisas ficam um pouco mais complicadas como por exemplo, o código tem que ser escrito de uma maneira diferente para que funcione corretamente, Mais também tem as suas vantagens, como, botão de fechar e minimizar automático icones ao lado do titulo entre outros, agora vamos ver alguns exemplos: 1° vou dar um exemplo de codigo '.lua', para se usar com a matriz MiniWindow E agora 1 exemplo de código .otui usando MiniWindow de forma errada MiniWindowid: tutorialWindow!text: tr('Tutorial')size: 150 120@onClose: onMiniWindowClose()&save: trueButtonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right E agora 1 exemplo de cósigo .otui usando MiniWindow escrito certo TutorialButton < Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightMiniWindowid: tutorialWindow!text: tr('Tutorial')height: 150@onClose: onMiniWindowClose()&save: trueMiniWindowContentsTutorialButton Agora vamos intender o porque dessa forma mais complicada. 1° para que o MiniWindow funcione corretamente ele precisa da função 'MiniWindowContents' dentro dele, dentro dessa função existem duas formas de adicionarmos itens, que são elas: 1° TutorialButton < Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightMiniWindowid: tutorialWindow!text: tr('Tutorial')height: 150@onClose: onMiniWindowClose()&save: trueMiniWindowContentsTutorialButton 2° MiniWindowid: tutorialWindow!text: tr('Tutorial')height: 150@onClose: onMiniWindowClose()&save: trueMiniWindowContentsButtonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right Dos dois modos estão certos, mais é importante lembrar que você também pode usar as duas maneiras juntas como no exemplo: TutorialButton < Buttonid: tutorialbutton!text: tr('xD')anchors.top: prev.bottomanchors.left: parent.leftanchors.right: parent.rightMiniWindowid: tutorialWindow!text: tr('Tutorial')height: 150@onClose: onMiniWindowClose()&save: trueMiniWindowContentsButtonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.rightTutorialButton Você também pode adicionar um icone na MiniWindow, como exemplo: MiniWindowid: tutorialWindow!text: tr('Tutorial')height: 150icon: /images/topbuttons/skills@onClose: onMiniWindowClose()&save: true Lembre-se que '/images/topbuttons/' é o diretório onde o ícone tá, e 'skills' é a imagem. Bom, esse é um tutorial mais básico só para apresentar as 2 Janelas matrizes ( Eu só conheço esses 2 modelos "Main, Mini" e não sei se existem outros.) e ensinar um pouco da diferença e das vantagens entre usar uma e outra. Passo 2: Adicionando funções aos botoes Bom até agora eu só mostrei os botoes mais ainda não ensinei a fazer eles executarem outra funções, e é isso que eu estarei ensinando agora. Existem diversas formas de um botão executar uma função, Você pode criar essa função no arquivo.lua caso ela seja mais complexa ou pode fazer elas direto no arquivo.otui. Tenha em mente, que não irei ensinar a criar funções, só estarei ensinando a como fazer um botão executar ela. Vamos pegar nosso botão Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right Aqui nesse exemplo, o botão é criado mais não tem nem uma função pre definida, ou seja, mesmo que clicando nele nada irá acontecer. Agora vamos fazer uma função dento do arquivo.lua para que o botão execute function sendBottom()return g_game.talk('Nossa Funcionou')end Quando a função sendBottom for executada o jogador vai falar "Nossa Funcionou" Agora vamos fazer o botão executar ela usando esta função @onClick: a função onClick vai ser executada quando alguém clicar no nosso botão, Agora vamos adicionar ela no nosso botão e adicionar o parâmetro que ela deve executar. Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right@onClick: sendBottom() Pronto agora nosso botão vai executar o que lhe foi programado, Porem por ele executar uma função simples podemos simplificar ainda mais o que nosso botão deve fazer deixando assim: Buttonid: tutorialbutton!text: tr('Ok')anchors.top: parent.topanchors.left: parent.leftanchors.right: parent.right@onClick: g_game.talk('Nossa Funcionou') Ele irá fazer a mesma coisa que a função sendBottom() porem não precisamos criar nada dentro do arquivo.lua1 ponto -
Broadcasts seguidas
MonsterB0SS reagiu a 20cm por um tópico no fórum
Bom, o script que venho lhes dar/mostrar hoje é um globalevent que manda broadcast messages. Sim, isso é muito comum e fácil, mas o que diferencia esse dos outros é que esse aqui manda as mensagens em ordem, uma de cada vez, e num só script. data/globalevents/scripts/broadcasts.lua: data/globalevents/globalevents.xml: configurando e explicando: Acho que é isso Façam bom uso e podem deixar um rep+ caso queiram Valeu!1 ponto -
Broadcasts seguidas
MonsterB0SS reagiu a Vodkart por um tópico no fórum
acho que assim tbm dá function onThink(interval) local mds,msgs = 3435,{ [0] = "Texto1", [1] = "Texto2", [2] = "Texto3", [3] = "Texto4", [4] = "Texto5" } if getGlobalStorageValue(mds) == -1 then setGlobalStorageValue(mds,0) end doBroadcastMessage(msgs[getGlobalStorageValue(mds)]) setGlobalStorageValue(mds, getGlobalStorageValue(mds) < #msgs and getGlobalStorageValue(mds)+1 or 0) return true end1 ponto -
[Outfit] Adicionando Bônus A Seus Addons Usando Funções.
gacjogos reagiu a Vitinhowcq por um tópico no fórum
Primeiro de tudo, vou avisando tirei do OTLAND.NET Créditos: -Kawon 100% -Vitinhowcq, 3% por postar aqui no xTibia Vamos oque interessa! Explicando: Está função só funciona se você estiver usando um addon full. Então só darão atributos a addons fulls. Vá em data/XML/outfits.xml -Primeiro lembre que você pode editar seus atributos aos addons. e por exemplo há varios tipos de atributos ao usar vou postar aqui: manaShield invisible healthGain/healthTicks manaGain/manaTicks speed -------------- reflect percentAll reflect percentElements reflect percentMagic reflect percentEnergy reflect percentFire reflect percentPoison reflect percentIce reflect percentHoly reflect percentDeath reflect percentLifeDrain reflect percentManaDrain reflect percentDrown reflect percentPhysical reflect percentHealing reflect percentUndefined reflect chanceAll reflect chanceElements reflect chanceMagic reflect chanceEnergy reflect chancetFire reflect chancePoison reflect chanceIce reflect chanceHoly reflect chanceDeath reflect chanceLifeDrain reflect chanceManaDrain reflect chanceDrown reflect chancePhysical reflect chanceHealing reflect chanceUndefined -------------- absorb percentAll absorb percentElements absorb percentMagic absorb percentEnergy absorb percentFire absorb percentPoison absorb percentIce absorb percentHoly absorb percentDeath absorb percentLifeDrain absorb percentManaDrain absorb percentDrown absorb percentPhysical absorb percentHealing absorb percentUndefined -------------- skills fist skills club skills axe skills sword skills distance skills shielding skills fishing skills melee (fist, club, sword y axe) skills weapon (club, sword, axe, dist) skills fistPercent skills clubPercent skills axePercent skills swordPercent skills distancePercent skills shieldingPercent skills fishingPercent skills meleePercent (fist, club, sword y axe) skills weaponPercent (club, sword, axe, dist) -------------- stats maxHealth stats maxMana stats soul stats level stats magLevel stats maxHealthPercent stats maxManaPercent stats soulPercent stats levelPercent stats magLevelPercent -------------- supress poison supress fire supress energy supress physical supress haste supress paralyze supress invisible supress light supress manaShield supress drunk supress drown supress muted Agora vou mostrar como colocar no seu outfit.xml Por exemplo vou editar aqui a outfit hunter. Tag: Lembre que sempre edite corretamente os "/>" no final dos atributos. e sempre adicione a tag no final dos atributos .Use esse exeplo da outfit hunter como montar para botar para os addons darem atributos. ATÉ MAIS. SE GOSTOU. REP+ ^^1 ponto