Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 02/24/13 em %
-
OtClient - Tutorial Básico #1
TkZeCo e 4 outros 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.5 pontos -
[Tutorial] Paredes
Lasseternal e um outro reagiu a Danilonilo por um tópico no fórum
Essa será minha 3ª aula, e minha primeira de nível intermediário Eu usarei o programa Paint.NET para dar a aula, e recomendo vocês também usarem ele Download do Paint.NET A Parede em Si A parede, no Tibia, tem que possuir normalmente 64x32 de área (Largura x Altura) Fazendo uma parede normal Primeiro crie uma nova imagem de 64x32 (CTRL+N) Então comece fazendo uma linha diagonal na ponta de baixo da imagem até aonde chegar Complete em cima até chegar o máximo á esquerda Da ponta de cima até onde chegar, faça outra linha diagonal Termine a parte de baixo Se quiser pode destacar o meio Colorindo Primeiramente comece pelo verde, ponha a cor base e os detalhes As linhas vermelhas e azuis são das mesmas cores que o lado verde, então complete que nem estou fazendo: Primeiro pinte os detalhes Depois pinte as partes assim: A parte vermelha de cima ficará mais clara que as outras, que são a mesma cor base Percebeu que aonde estava a linha vermelha, está mais claro? Porque não tenta pegar as imagens e dar um zoom? Atenção, no meio da aula, eu me distraí e esqueci de mostrar uma coisa, quando você fizer os detalhes, faça de uma forma que uma linha azul se ligue com a outra Ex: Fazendo as bordas Pra começar, faça linhas para cima em baixo e na ponta, a largura você que decide, se for uma borda grande, será mais largura, se for pequena, menos. Então complete com uma linha diagonal ligando as pontas, é importantíssimo que elas tenham a mesma largura, se for uma parede reta. Depois, façam uma borda plana em cima (lembram da minha primeira aula, quando disse sobre as coisas planas sempre serem retas e estendidas?) Colora e deixe as linhas roxas com as mesmas cores, igual citei agora pouco A parte de cima ficará mais clara, pois é onde bate o sol Fazendo o suplemento de baixo Primeiramente, pegue a ferramenta varinha mágica , e lá em cima, clique na Lâmpada , que ficará assim. Nós clicamos na lâmpada, pois o globo, quando for clicar com a varinha mágica, selecionará as cores iguais de todo o desenho, e não só as ligadas, também funciona com o Preenchimento, ou "Balde de Tinta", que pintará as mesmas cores em todo o desenho. Segurando CTRL, clique nas cores da parede, até que fique totalmente preenchida, então copie (CTRL+C) Depois disso, Gire a imagem 90º (CTRL+H) e a inverta na horizontal (Imagem>Inverter Horizontalmente) Assim, nós mudamos o lado da parede de frente para o lado Após isso, cole a imagem que tínhamos copiado, e ficará assim Faça as devidas edições Fazendo o suplemento de cima Com a imagem que criamos, selecione de uma cor forte a parte que está juntando as paredes Então remova o que tiver fora da linha vermelha, recomendo colocarem o Preenchimento/Balde de Tinta e mudar a tolerância para 60% +-, fazendo assim que preencha as diferentes tonalidades de cinza, faça os devidos tests, se não der muito certo, desfaça o erro com um CTRL+Z Pinte igual as outras etapas Pronto, terminamos a parede e seus complementos! Quer ver como ficou? Não ficou lá essas coisas, pois eu me esqueci de dar aquela ligadura de detalhes, e eu não sombreei nem texturei a parede, mas isso fica pra aula de texturas, não é?! Tcharam Créditos: Danilonilo82 pontos -
OtClient - Tutorial Básico #2
Ryukiimaru e um outro 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.lua2 pontos -
Tipo cara as vezes se não pode falar do Gears Ele é um bom mappear, ajudou muito bem fazendo algumas bases ! É um cara muito legal e acho que também ele merece um pouco de respeito.2 pontos
-
Script Portal de monstros
Demonbholder e um outro reagiu a dalvorsn por uma questão
local monsters = { "Ogre", "demon", } local id_portal = 12593 local chance = 500 -- 50% function onUse(cid, item, fromPosition, itemEx, toPosition) if itemEx.itemid == id_portal then doRemoveItem(item.uid, 1) if math.random(1000) <= chance then local monster = doCreateMonster(monsters[math.random(#monster)],toPosition) doSendMagicEffect(toPosition, 1) if isCreature(monster) then local summon = getCreatureSummons(cid)[1] doSendMagicEffect(summon and getCreaturePosition(summon) or fromPosition, 173) doChallengeCreature(summon and summon or cid, monster) end end end return true end Ajustado.2 pontos -
Olá xtibianos! Acredito que esse seja meu primeiro tutorial feito por mim mesmo aqui no fórum, espero que gostem e aprovem Rep + Introdução: Nesse tutorial, vou lhes ensinar como instalar e configurar o sistema de PagSeguro automático, para que quando o pagamento for Aprovado pelo PagSeguro, o sistema entregar os pontos automaticamente. Testado e funcionando em Gesior e Modern Acc. Funciona para qualquer versão de Tibia, desde que seja em MySQL. Quando você for testar, pode acontecer que os pontos sejam entregues com um atraso de no máximo 5~10 minutos depois de Aprovado o pagamento, porém, geralmente os pontos são entregues NA HORA do Aprovado pagamento. Instalação: Primeiramente vamos adicionar uma tabela na sua DataBase do MySQL, Executem esta query para criar a tabela: Feito isso, vamos editar ou adicionar se você já não tiver, essas linhas no seu htdocs/config/config.php : Depois, vamos adicionar essas linhas no seu htdocs/index.php : Agora, troque todo o seu htdocs/shopsystem.php (pode variar, mas no gesior geralmente é shopsystem.php)por este: Também troque todo o seu htdocs/donate.php (pode variar, mas no gesior geralmente é donate.php) por este: Agora, crie um novo arquivo .php com o nome pag_retorno.php com este conteúdo: Por último mas não menos importante, entre no site do PagSeguro e logue, após logar, vai aparecer várias opções na parte inferior do site do PagSeguro, clique em "Retorno Automático". Nesta página, é onde você gera o seu Token PagSeguro e configura sua URL de retorno. Você deve ativar a URL de retorno, e colocar este link na URL de Retorno: Pronto, já está tudo OK, agora vou ensinar como configurar algumas partes de alguns arquivos que citei acima. Configuração Adicional: Depois que você já alterou as informações no config.php no que é pedido, algumas alterações devem ser feitas também no arquivo htdocs/pag_retorno.php : (não esqueça de editar as partes que pedem informações sobre usuario, senha, nome db do MYSQL) 1 - Nas linhas: Você deve alterar o que está sendo pedido, e no "127.0.0.1", se você usa seu site no mesmo PC ou Dedicado/VPS que o seu Server, pode deixar "127.0.0.1" mesmo, se não (no caso de usar domínio), deve colocar ali o seu IP Externo Numérico do Server. 2 - Nas linhas: Esta parte é a que entrega os pontos automaticamente pra account, se você tem algum tipo de promoção no seu server, deve alterar aqui conforme sua promoção, exemplo: Se você tem a promoção de Double Points no seu Server, deve alterar: Por este: Para que os pontos sejam DOBRADOS na hora de entregar automaticamente, entendeu? Bom Galera, é isso aí, espero que gostem. Dúvidas, Sugestões ou Críticas, postem aqui para que eu possa atender a todos. Créditos: Tutorial feito 100% por mim (Lucas502 - xtibia.com) Te Ajudei? Então REP+ aew! EDIT: Adicionados Spoilers para melhor visualização do tópico.1 ponto
-
Eae Xtibianos Blz? Agradecerei a quem comentar o tópico. Esse Script serve para Poketibia, mais não testei em ot servers de Tibia. Vim Trazer a Vcs Uma Talkaction Bem Legal. Você está cansado de ficar indo até o corpo do pokemon para pegar o loot? Então ake está um sistema que ao invés de você ter que ir no corpo do pokemon pegar o loot, esse script pega automaticamente para você. Vamos Ao Script: Vá em Talkactions.xml adicione isso la parte dos players: Agora em Crie um Arquivo .lua e com nome de aloot.lua e coloque isso e salve dentro da pasta Talkactions: Gente desculpa, esqueci de por a parte do creaturescripts. Agr vá em creaturescripts.xml e adicione essa tag: <event type="login" name="aloot_reg" event="script" value="aloot.lua"/> <event type="kill" name="aloot_kill" event="script" value="aloot.lua"/> Agr crie um arquivo .lua e com nome de aloot.lua e coloque isso dentro e salve dentro da pasta creaturescripts/scripts. function onLogin(cid) registerCreatureEvent(cid, "aloot_kill") return true end local stor = 7575 function autoloot(cid, target, pos) local function doStack(cid, itemid, new) local count = getPlayerItemCount(cid, itemid) if (count > 100) then count = count - math.floor(count / 100) * 100 end local newCount = count + new if (count ~= 0) then local find = getPlayerItemById(cid, true, itemid, count).uid if (find > 0) then doRemoveItem(find) else newCount = new end end local item = doCreateItemEx(itemid, newCount) doPlayerAddItemEx(cid, item, true) end local function scanContainer(cid, uid, list) for k = (getContainerSize(uid) - 1), 0, -1 do local tmp = getContainerItem(uid, k) if (isInArray(list, tmp.itemid)) then if isItemStackable(tmp.itemid) and (getPlayerItemCount(cid, tmp.itemid) > 0) then doStack(cid, tmp.itemid, tmp.type) else local item = doCreateItemEx(tmp.itemid, tmp.type) doPlayerAddItemEx(cid, item, true) end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Looted ' .. tmp.type .. ' ' .. getItemNameById(tmp.itemid) .. '.') doRemoveItem(tmp.uid) elseif isContainer(tmp.uid) then scanContainer(cid, tmp.uid, list) end end end local items = {} for i = getTileInfo(pos).items, 1, -1 do pos.stackpos = i table.insert(items, getThingFromPos(pos)) end if (#items == 0) then return end local corpse = -1 for _, item in ipairs(items) do local name = getItemName(item.uid):lower() if name:find(target:lower()) then corpse = item.uid break end end if (corpse ~= -1) and isContainer(corpse) then scanContainer(cid, corpse, tostring(getPlayerStorageValue(cid, stor)):gsub('_', ''):explode(',')) end end function onKill(cid, target, lastHit) if not isPlayer(target) then local infos = getPlayerStorageValue(cid, stor) if (infos == -1) then return true end local list = tostring(infos):explode(',') if (#list == 0) then return true end addEvent(autoloot, 150, cid, getCreatureName(target), getCreaturePosition(target)) end return true end FIM... Espero que gostem ...agradecerei a quem comentar. Se o script te ajudou: Vale um REP+? Só apertar no + ali no canto da tela.Nao Vai Quebrar a Mão. VLW.1 ponto
-
Global Map RL 9.80 / 9.81
micheumelo reagiu a leandrovp por um tópico no fórum
Global Map RL 9.80 / 9.81 • Menu: ├ Informações; ├ Prints; ├ Creditos. └ Download. • Informações Basicas • » Trainer offline Estatuas e Camas 100% » Novas Areas 100% » Mounts 100% » Items 97% » Outfits 100% » Warzone 100% » Gnomos Base 100% » Gray Island 95% » Task System 100% Com seus Bosses » Todas as magias novas com Exhausted nao muito prolongado. » Todos os Monsters para 9.70 (precisa adicionar o novo 9,8 + incluindo spawns em Venore) » A Maioria das quests do tibia rl • PrintScreen • • Creditos • Leandrovp : 3% Arthurluna : 2% NvSo : 5% Kaiser and The OTX Team : 10% TheForgotten Server : 40% Cipsoft : 40% Stigal - 0% (SCAN) • Download's • » Venore - Npc / Monsters: » Download Do Servidor : (4SHARED) http://www.4shared.com/get/57KmpCHt/Ot_981.html » Scan: (AVG) Skype : Leandro_machado92 Face : /leandro.machado.5243 Msn : Leandrinhodoparaguai@hotmail.com1 ponto -
Prision System
Demonbholder reagiu a comedinhasss por um tópico no fórum
Versão testada: 9.4+ (Pode funcionar em anteriores) Descrição: O script de cadeia feito por FreaksOt onde eu modifiquei e fiz algumas alterações. Alterações: - Quando prende o player ele não fica mais em um local fixo, você pode configurar para coloca-lo em outras celas. - O tempo pode ou não ser fixo, é só você digitar /jail (nome do player) para um tempo fixo ou /jail (nome do player), (tempo) para coloca-lo com um tempo especifico. -- OBS: O tempo é posto em segundos. (120 segundos = 2 minutos) TAG: <talkaction log="yes" words="/jail;!jail;/prender;!prender;/unjail;!unjail;/desprender;!desprender" access="3" event="script" value="prisao.lua"/> Script: data/talkaction/prisao.lua grouprequired = 3 jailedstoragevalue_time = 1338 jailedstoragevalue_bool = 1339 local jailpos = { [1] = {x = 59, y = 52, z =6}, [2] = {x = 59, y = 52, z =5}, [3] = {x = 55, y = 47, z =6}, [4] = {x = 55, y = 47, z =5}, [5] = {x = 55, y = 52, z =6}, [6] = {x = 55, y = 52, z =5}, [7] = {x = 59, y = 47, z =5}, [8] = {x = 63, y = 52, z =5} } local unjailpos = { x = 63, y = 54, z =6 } jail_list = {} jail_list_work = 0 function checkJailList(param) addEvent(checkJailList, 1000, {}) for targetID,player in ipairs(jail_list) do if isPlayer(player) == TRUE then if getPlayerStorageValue(player, jailedstoragevalue_time) < os.time() then doTeleportThing(player, unjailpos, TRUE) setPlayerStorageValue(player, jailedstoragevalue_time, 0) setPlayerStorageValue(player, jailedstoragevalue_bool, 0) table.remove(jail_list,targetID) doPlayerSendTextMessage(player, MESSAGE_STATUS_CONSOLE_ORANGE, 'Você saiu da cadeia, tente não fazer coisas malvadas da próxima vez para não ser preso novamente. Cuide-se amigo.') end else table.remove(jail_list,targetID) end end end function onSay(cid, words, param, channel) if(param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.") return true end local t = string.explode(param, ",") if jail_list_work == 0 then jail_list_work = addEvent(checkJailList, 1000, {}) end local jail_time = -1 for word in string.gmatch(tostring(t[1]), "(%w+)") do if tostring(tonumber(word)) == word then jail_time = tonumber(word) end end local isplayer = getPlayerByName(t[1]) if isPlayer(isplayer) ~= TRUE then isplayer = getPlayerByName(string.sub(t[1], string.len("jail_time")+1)) if isPlayer(isplayer) ~= TRUE then isplayer = getPlayerByName(string.sub(t[1], string.len("jail_time")+2)) if isPlayer(isplayer) ~= TRUE then isplayer = getPlayerByName(string.sub(t[1], string.len("jail_time")+3)) end end end local default_jail = 30 if(t[2]) then default_jail = t[2] end if jail_time ~= -1 then jail_time = jail_time * 60 else jail_time = default_jail end if (words == '!prender' or words == '/prender') then if getPlayerGroupId(cid) >= grouprequired then if isPlayer(isplayer) == TRUE then doTeleportThing(isplayer, jailpos[math.random(#jailpos)], TRUE) setPlayerStorageValue(isplayer, jailedstoragevalue_time, os.time()+jail_time) setPlayerStorageValue(isplayer, jailedstoragevalue_bool, 1) table.insert(jail_list,isplayer) doPlayerSendTextMessage (cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'Você prendeu o player: '.. getCreatureName(isplayer) ..' ate ' .. os.date("%H:%M:%S", getPlayerStorageValue(isplayer, jailedstoragevalue_time)) .. ' (agora é: ' .. os.date("%H:%M:%S", os.time()) .. ').') doPlayerSendTextMessage (isplayer, MESSAGE_STATUS_CONSOLE_ORANGE, 'Voce foi preso por '.. getCreatureName(cid) ..' ate ' .. os.date("%H:%M:%S", getPlayerStorageValue(isplayer, jailedstoragevalue_time)) .. ' (agora é: ' .. os.date("%H:%M:%S", os.time()) .. ').') else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Este jogador não existe ou esta offline.") end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você não tem permissão para prender players.") end elseif (words == '!desprender' or words == '/desprender') then if getPlayerGroupId(cid) >= grouprequired then if isPlayer(isplayer) == TRUE then if getPlayerStorageValue(isplayer, jailedstoragevalue_bool) == 1 then doTeleportThing(isplayer, unjailpos, TRUE) setPlayerStorageValue(isplayer, jailedstoragevalue_time, 0) setPlayerStorageValue(isplayer, jailedstoragevalue_bool, 0) table.remove(jail_list,targetID) doPlayerSendTextMessage(isplayer, MESSAGE_STATUS_CONSOLE_ORANGE, 'O player '.. getCreatureName(cid) ..' te tirou da prisão. Te vejo em breve!!!') doPlayerSendTextMessage (cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'Você tirou da prisão o player: '.. getCreatureName(isplayer) ..'.') else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Este jogador não está preso.") end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Este jogador não existe ou esta offline.") end else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você não tem permissão para prender players.") end end return true end Config: local jailpos = { -- Local das selas onde o player vai aparecer. local unjailpos = { x = 63, y = 54, z =6 } -- Local onde ele irá sair. local default_jail = 30 -- Tempo padrão. Créditos: FreaksOt Comedinha (Bruno Carvalho)1 ponto -
Esse sistema serve para que você possa usar duas weapons ao mesmo tempo uma em cada slot correspondente as mãos do personagem. Com ele você pode utilizar duas sword's, dois axe's, dois club's ou etc... Esse sistema simplismente soma o attack do item que estiver no slot esquerdo com o attack do item que estiver no slot esquerdo. Aew vai os code para inserir nas sources! Vá em player.ccp e procure por: ret = RET_CANONLYUSEONEWEAPON; Você ira encontrar dois "ret = RET_CANONLYUSEONEWEAPON;", substitua por: ret = RET_NOERROR; Após, localize weapons.h e procure por: const Weapon* getWeapon(const Item* item) const; Embaixo você coloca: static int32_t getAttackLeft; static int32_t getAttackRigth; static int32_t getLeftExtraAttack; static int32_t getRigthExtraAttack; Depois, localize weapons.ccp e procure por: int32_t WeaponMelee::getWeaponDamage(const Player* player, const Creature* target, const Item* item, bool maxDamage /*= false*/) const { int32_t attackSkill = player->getWeaponSkill(item); int32_t attackValue = std::max((int32_t)0, (int32_t(item->getAttack() + item->getExtraAttack()) - elementDamage)); float attackFactor = player->getAttackFactor(); Substitua por: int32_t WeaponMelee::getWeaponDamage(const Player* player, const Creature* target, const Item* item, bool maxDamage /*= false*/) const { int32_t getAttackLeft; int32_t getAttackRigth; int32_t getLeftExtraAttack; int32_t getRigthExtraAttack; getAttackLeft = 0; getAttackRigth = 0; getLeftExtraAttack = 0; getRigthExtraAttack = 0; if (getAttackLeft == 0) { if (player->getInventoryItem(SLOT_LEFT) != NULL) { getAttackLeft = player->getInventoryItem(SLOT_LEFT)->getAttack(); getLeftExtraAttack = player->getInventoryItem(SLOT_LEFT)->getExtraAttack(); } else if (player->getInventoryItem(SLOT_LEFT) == NULL) { getAttackLeft = 0; getLeftExtraAttack = 0; } } if (getAttackRigth == 0) { if (player->getInventoryItem(SLOT_RIGHT) != NULL) { getAttackRigth = player->getInventoryItem(SLOT_RIGHT)->getAttack(); getRigthExtraAttack = player->getInventoryItem(SLOT_RIGHT)->getExtraAttack(); } else if (player->getInventoryItem(SLOT_RIGHT) == NULL) { getAttackRigth = 0; getRigthExtraAttack = 0; } } int32_t attackValue = std::max((int32_t)0, (int32_t)((getAttackLeft + getLeftExtraAttack + getAttackRigth + getRigthExtraAttack) - elementDamage)); int32_t attackSkill = player->getWeaponSkill(item); float attackFactor = player->getAttackFactor(); Compile e pronto!1 ponto
-
Player Check System
Rikutachimoto reagiu a comedinhasss por um tópico no fórum
Versão: 3.2 Versão de tibia: 9.4+ (Funciona em anteriores) Descrição: Existem muitos scripts que ajudam o administrador do servidor a cuidar dele, um deles é saber coisas sobre quem está jogando e se está sendo honesta. Eu peguei alguns scripts e estou juntando em um para diminuir o tamanho e ter uma fácil verificação. TAG: <talkaction log="yes" words="!p;/p" access="5" event="script" value="playercheck.lua"/> Script: Talkactions/scripts/playercheck.lua local config = { check = {"check", "viwer", "verificar", "ver"}, delete = {"del", "delete", "deletar"}, search = {"search", "procurar"} } function getItemsInContainer(cont, sep) local text = "" local tsep = "" local count = "" for i=1, sep do tsep = tsep.."-" end tsep = tsep..">" for i=0, getContainerSize(cont.uid)-1 do local item = getContainerItem(cont.uid, i) if isContainer(item.uid) == FALSE then if item.type > 0 then count = "("..item.type.."x)" end text = text.."\n"..tsep..getItemNameById(item.itemid).." "..count.." ("..item.itemid..")" else if getContainerSize(item.uid) > 0 then text = text.."\n"..tsep..getItemNameById(item.itemid).." ("..item.itemid..")" text = text..getItemsInContainer(item, sep+2).." ("..item.itemid..")" else text = text.."\n"..tsep..getItemNameById(item.itemid).." ("..item.itemid..")" end end end return text end function onSay(cid, words, param, channel) local slotName = {"Cabeça", "Amuleto", "Backpack", "Armor", "Mao Direita", "Mao Esquerda", "Legs", "Pés", "Ring", "Ammo Slot"} local t = string.explode(param, ",") if(table.isStrIn(param, config.check)) then if getPlayerGroupId (cid) >= 5 then local player = getPlayerByNameWildcard(t[2]) if isPlayer(player) == TRUE then local text = getPlayerName(player).."'s Equipment: " for i=1, 10 do text = text.."\n\n" local item = getPlayerSlotItem(player, i) if item.itemid > 0 then if isContainer(item.uid) == TRUE then text = text..slotName[i]..": "..getItemNameById(item.itemid).." ("..item.itemid..") "..getItemsInContainer(item, 1) else text = text..slotName[i]..": "..getItemNameById(item.itemid).." ("..item.itemid..")" end else text = text..slotName[i]..": Empty" end end doShowTextDialog(cid, 6579, text) else doPlayerSendCancel(cid, "This player is not online.") end end elseif(table.isStrIn(param, config.delete)) then if getPlayerGroupId(cid) >= 5 then local player = getPlayerByNameWildcard(t[3]) if isPlayer(player) == TRUE then count = t[4] if(not t[4]) then count = 1 end if getPlayerItemCount(player, t[2]) > 0 then if doPlayerRemoveItem(player, t[2], count) then doPlayerSendCancel(cid, "Item Deletado.") else doPlayerSendCancel(cid, "Este player não esta quantidade.") end else doPlayerSendCancel(cid, "Este player não tem o item.") end end end elseif(table.isStrIn(param, config.search)) then if getPlayerGroupId (cid) >= 5 then local player = getPlayerByNameWildcard(t[3]) local result = db.getResult("SELECT name, online FROM players WHERE id IN (SELECT player_id FROM player_items WHERE itemtype = ".. t[2] ..");") local msg = "Resultados da busca pelo item ".. t[2] .." em seu banco de dados:\n\n" if result:getID() ~= -1 then while true do local name = result:getDataString("name") local online = result:getDataInt("online") msg = msg .. name .." [".. (online == 1 and "Online" or "Offline") .."]\n" if not result:next() then break end end else msg = msg .. "O item não foi encontrado em nenhum jogador." end doShowTextDialog(cid, t[2], msg) end end return true end Explicação: Quando o god digita: /p check, (PNAME) - Ele verifica os items que o player tem. /p del, (ID), (PNAME), (COUNT) - Ele deleta o item de determinado player (Se não colocar o count ele irá remover somente 1). /p search, (ID) - Ele verifica quantos players tem tal item e se está online. Créditos: Oneshot CaioODemais Comedinha (Bruno Carvalho)1 ponto -
Aula Deserto #1 (OÁSIS)
FenixBorges reagiu a Kausen por um tópico no fórum
Hoje vou explicar como criar um "OÁSIS" O que é um Oasis? .Oásis é uma área isolada de vegetação em um deserto, tipicamente vizinho a uma nascente ou fonte de água. Bom vamos começar a explicação da aula 1º Passo. Criaremos suas bordas usado 3 tipo de bordas. -Bordas de terra/água:(4644~4663) -Bordas de pedra/água:(6639~6650) -Bordas de areia/água:(7943~7954) Assim criaremos um formato que fique bonito. 2º Passo Ainda mexendo com as bordas... usando as borda de areia faremos um contorno perto das bordas de pedra, pois mais além vai ter um piso de pedra... Bordas de areia grossa:(8335~8346) Bordas de areia fina :(4773~4783) Bordas de areia espalhada:(4760~4771) OBS: Vocês pode usar umas bordas de grama para dar um charme no mapa.(nunca exagere com grama no deserto) 3º Passo. Adicionando os piso.. piso de pedra:(4405~4421) piso de terra:(103) 4º Passo. natureza. Coisa simples que muitos erram. a natureza do deserto é muito parecido com a classificação da natureza normal. a cada 4~6 sqms vocês faram os grupo de Palmeiras com caquetos e assim por diante. a cada palmeira ou caquetos grande vocês usaram de 1 a 3 caquetos pequenos perto das palmeiras ou caquetos grande, nunca saindo mais longe que 2 sqm, os tufos pode ser usado até 4 no máximo se usar a mais ficará poluído. As mangroves não são tão necessário, só se for sua opção usar para deixar um pouco mais bonito o mapa em si. 5º Passo. Os gravel tanto de pedra,terra ou areia serão adicionado nos lugares certos. Por exemplos o gravel de pedra será coloca perto das pedras grande,perceba que ela fica por cima das bordas de areia.coisa fácil é só colocar as mesmas bordas encima do gravel. 6º Passo. Agora finalizando a aula, colocaremos umas pedrinhas perto das rochas grande e encimas das gravel.. Finalizando. Que quiser colocar um barquinho em seu Oásis para dar um destaque ficara bom... perceba que tem bordas de areia por cima do barco da um olhar de que o barco ta abandonado a tempo ali. e como fazer isso? simples vá ao floor 6 e adicionas ar bordas por cima do barco. alguns falaram que na hora que o player passa ali a bordas ficará por cima dele, e dae? é pra dar um ar de grandeza ao mapa e não será visto como um bug. Ingame. Obrigado pela atenção e até a próxima aula de DESERTO. Gostou REP+1 ponto -
Construções Vamos começar a aula ‘explorando’ o RME. Para fazer sua construção, tenha em mente duas coisas. 1º Casca //X// 2º Decoração Para montar a sua casca você precisa inicialmente ter em mente de alguns tipos de formatos agradáveis para montar sua construção. Eis alguns meros detalhes: Após ter em mente, alguns formatos a se seguir. Você deve iniciar a montagem de sua área. Siga a ‘tabela’ da casca. Vamos montar a parede de seu local: Escolha o tipo de parede e o tipo de formato a se usar, não tem problema errar no tipo de parede [se erra no tipo de parede, partir do momento que o que fora montado no final, não tenha ‘combinado’ com a parede], pois modificar o tipo de parede usado é simples [irei dar um exemplo de erro na hora da escolha da parede], mas modificar o tipo de formato usado já é mais trabalhoso. Após ter erguido a parede de sua área, você deve por o piso. Lembrem-se, os pisos são tão importantes quanto às paredes (escolha um tipo de piso agradável). Após ter tido este ‘trabalho’, você deve colocar as bordas de sua construção. Nunca use auto border, caso queira ter um trabalho ‘perfeito’ e 100% seu. Agora, depois de ter posto o chão, parede, bordas, etc.. Você deve colocar os aquedutos, já que esta construção tem dois andares. Eu preferi usar um tipo diferente de aqueduto. Tendo feito isto, você deve terminar a casca de sua obra, colocando um telhado e melhorando os aquedutos. Agora vamos iniciar o detalhamento (para finalizar o detalhamento, você deve ter em mente o que deseja fazer [casa,loja,templo,depot,etc..]; Visando isto, eu deixarei para vocês darem o acabamento desta construção). Agora coloquemos os itens decorativos não temáticos (como tochas, algumas das inúmeras bandeiras, etc..). Visualizando a obra final, da sua construção, é de fácil percepção que a parede não combinou com o total de sua obra. Então eu decidi mudar as paredes. E ficou assim a minha construção: Percebo que ficou muito ‘liso’ com esta mudança de paredes, então eu coloquei palisades. Para dar um ar mais detalhado nesta obra. Agora a obra final de sua área, com todas estas mudanças! Espero que tenham gostado desta aula. Lembre-se você deve terminar o detalhamento de sua área dependendo do tema. Obs: Eu não coloquei nenhuma escada, caso não tenham percebido, pois esta aula fora a introdução de construção, logo não sei se você prefere uma escada no interior da construção ou se no exterior, então vocês na hora de montarem a sua construção ponha-a no local onde preferir. Créditos 100% vital9001 ponto
-
[8.54+] Player Online Spoof
Demonbholder reagiu a comedinhasss por um tópico no fórum
Nome: Player Online Spoof Versão: 2.0 Suportada: Tfs 0.3 e 0.4 Descrição: Coloque quantos players quiser em seu otserv. Eu estava vendo um utilitário de player spoof e resolvi dar uma extraia no code e fazer com que você adicione quantos quiser em seu servidor. Em configmanager.cpp procure: m_confNumber[MAX_PLAYERS] = getGlobalNumber("maxPlayers", 1000); Abaixo adicione: m_confNumber[sPOOF_PLAYERS] = getGlobalNumber("spoofPlayers", 0); Em configmanager.h procure: MAX_PLAYERS, Abaixo adicione: SPOOF_PLAYERS, Em status.cpp procure: p = xmlNewNode(NULL,(const xmlChar*)"players");sprintf(buffer, "%d", g_game.getPlayersOnline());xmlSetProp(p, (const xmlChar*)"online", (const xmlChar*)buffer);sprintf(buffer, "%d", (int32_t)g_config.getNumber(ConfigManager::MAX_PLAYERS));xmlSetProp(p, (const xmlChar*)"max", (const xmlChar*)buffer);sprintf(buffer, "%d", g_game.getPlayersRecord());xmlSetProp(p, (const xmlChar*)"peak", (const xmlChar*)buffer); Modifique para: p = xmlNewNode(NULL,(const xmlChar*)"players");sprintf(buffer, "%d", g_game.getPlayersOnline()+(int32_t)g_config.getNumber(ConfigManager::SPOOF_PLAYERS));xmlSetProp(p, (const xmlChar*)"online", (const xmlChar*)buffer);sprintf(buffer, "%d", (int32_t)g_config.getNumber(ConfigManager::MAX_PLAYERS)+(int32_t)g_config.getNumber(ConfigManager::SPOOF_PLAYERS));xmlSetProp(p, (const xmlChar*)"max", (const xmlChar*)buffer);sprintf(buffer, "%d", g_game.getPlayersRecord()+(int32_t)g_config.getNumber(ConfigManager::SPOOF_PLAYERS));xmlSetProp(p, (const xmlChar*)"peak", (const xmlChar*)buffer); Em config.lua procure: maxPlayers = Abaixo adicione: spoofPlayers = 0 Configurando: No config.lua onde tem spoofPlayers = 0 substitua o valor 0 para o valor de players spoof que você deseja ter. Recomendações: Remova o comando /online de seu servidor ou modifique para somente gm+ pode utiliza-lo. Modifique no site o total de players e adicione +(a quantidade que você colocou). Créditos: Comedinha Utilitário Player Online Spoof (Luuuck)1 ponto -
Meu para de posta coisas assim, além de não ter nada a ver fica muito ridiculo pro tópico, parece que quer ganhar post a qualquer custo. Se quer comentar comenta sobre o mapa, seu problemas particulares ou não devem ser respondidos por PM.1 ponto
-
[Lista] Servidores Derivados 1.0
Stigal reagiu a PostadorHunter por um tópico no fórum
Dragon Ball Versão 1.0 Wodbo-Bianco V6.0 WODBO DBWarrior Tibia GTA By Beddy -- esse aqui o autor removeu o conteudo Pokeserver Tfs 0.3.6 Pokemon Centurion 4.01 ponto -
Fala pessoal do xtibia blz? vim trazer aqui um novo tipo de wand,não naão é aquelas de sempre,que so tem ataque de holy,ou de death,como sempre,e que o cara pode tirar "horrores",nela temos um conceito novos. -Danos de todos elementos,inclusive fisico -Danos são aleatorios -você escolhe quanto ela pode bater faça um arquivo na pasta weapons/scripts com nome de Wand.lua e cole isso la dentro quando for escolher o item que sera a wand nao esqueça de colocar isso depois cole essa Tag em weapon.xml Explicação min, max = 300, 300 -- dano minimo e maximo ja diz tudo "xxx" aqui é a ID do Item que sera a Wand Vai a imagen pra vocês de alguns dos danos que ela da Espero que gostem e que tenhao um bom proveito desse script que é exclusivo do meu ot :] SE COLOCAR EM OUTRO TOPICO OU OUTRO FORUM FAVOR COLOCAR OS DEVIDOS CREDITOS Creditos:Ao meu amigo Miller por ter feito ele para meu ot Creditos:a min por ter compartilhado com vocês Se gostou?de REP+1 ponto
-
Por Favor essas coisas se falam por pm1 ponto
-
Preciso do link de download do SPR editor
patricklolxd reagiu a PostadorHunter por uma questão
http://www.4shared.com/archive/hggLc8go/SPREditor.html?1 ponto -
Sim logo, logo estarei marcando um BETA.1 ponto
-
Uma arrumada no script do SkyLigh: <talkaction words="/createitem;!list" event="script" value="create.lua"/> OBS: ANTES ESTAVA MANDANDO MSG DE CANCEL SE TIVESSE OS ITEMS, E A FUNÇÃO DE REMOVE ESTAVA ERRADA )1 ponto
-
1 ponto
-
Em data / talkactions / scripts / renome algum arquivo para create.lua e adicione function onSay(cid, item, words, param) local remove = 2160 -- id do item que vai remover local removee = 2161 -- id do item que vai remover local itemid = 2162 -- id do item que vai ganhar if doRemoveItem(cid,remove) and doRemoveItem(cid,removee) == TRUE then doPlayerSendTextMessage(cid,22,"Você precisa de ter , 1 crystal coin , 1 sword hilt") return true end if(words == "!list") then doShowTextDialog(cid,7528,"Os Itens Necessários São ,1 crystal coin,1 sword hilt") return true end doPlayerAddItem(cid,itemid,type) doPlayerSendTextMessage(cid,22,"Parabéns você ganhou uma crystal sword") return true end em talkactions.xml <talkaction words="/createitem;/list" event="script" value="create.lua"/>1 ponto
-
1 ponto
-
Script Portal de monstros
Demonbholder reagiu a dalvorsn por uma questão
A chance ta muito baixa pow, 2%, eu refiz o script , esse negócio tava muito feio local monsters = { "Ogre", "demon", } local id_portal = 12593 local chance = 500 -- 50% function onUse(cid, item, fromPosition, itemEx, toPosition) if itemEx.itemid == id_portal then if math.random(1000) <= chance then local monster = doCreateMonster(monsters[math.random(#monster)],toPosition) doSendMagicEffect(toPosition, 1) doRemoveItem(item.uid) if isCreature(monster) then local summon = getCreatureSummons(cid)[1] doSendMagicEffect(summon and getCreaturePosition(summon) or fromPosition, 173) doChallengeCreature(summon and summon or cid, monster) end end end return true end1 ponto -
Agora vá em data/movements, abra o arquivo movements.xml com o bloco de notas e adicione essas tag: <movevent type="Equip" itemid="ID DA ARMOR" slot="armor" event="function" value="onEquipItem"/> <movevent type="DeEquip" itemid="ID DA ARMOR" slot="armor" event="function" value="onDeEquipItem"/ Aonde está "ID DA ARMOR", coloque o ID que está na tag dela em items.xml Boa sorte )1 ponto
-
vlw cara obrigadu!! só pra avisar a arvore foi doada para plfmoura se kiserem ela fale com ele!1 ponto
-
[Pokemon] Spr E Dat [Pokemons 5 Geração]
luangomess reagiu a Stigal por um tópico no fórum
Como criar novos pokemons? http://www.xtibia.com/forum/topic/200247-tutorial-criando-novos-pokemons-para-pda-iniciantes/ Agora como adicionar no cliente, utiliza o "Buscar" que tem diversos.1 ponto -
Duvida Simples com Spells
LaercioLCLB reagiu a Roksas por uma questão
Group IP = 5 Acess = 5 Tentaisso dps1 ponto -
PEDIDO : NPC PROMOTION
sergionilo reagiu a Roksas por uma questão
Bom, vamos lá. Vá em data/npc/scripts, crie um arquivo chamado promo2.lua e adicione isso dentro: Para configurar, aonde eu selecionei de vermelho são: preço e lvl necessário! Agora em data/npc, crie um arquivo chamado Promo Sell.xml e adicione isso dentro: Espero que funcione ^^1 ponto -
Script Portal de monstros
Demonbholder reagiu a dalvorsn por uma questão
caralho vei, que script horroroso =s, enfim, ta ai: local monstro = { "Ogre", "demon", } local chance = 20 --2% chance function onUse(cid, item, fromPosition, itemEx, toPosition) local function back(item, pos) doCreateItem(item.itemid, 1, pos) end if itemEx.itemid == 12593 then -- id do portao local item = getTileItemById(toPosition, 12593) -- id do portao addEvent(back, choose(5, 10, 15) * 60 * 1000, itemEx, toPosition) doSendMagicEffect(toPosition, 1) if math.random(1000) <= chance then local this = monstro[math.random(#monstro)] local pokes = doCreateMonster(this,toPosition) if isCreature(pokes) then local summon = getCreatureSummons(cid)[1] if isCreature(summon) then doSendMagicEffect(getThingPos(summon), 173) doChallengeCreature(summon, pokes) else doSendMagicEffect(getThingPos(cid), 173) doChallengeCreature(cid, pokes) end end end end return true end1 ponto -
Faz algo próprio essa é minha dica, além da liberdade de poder fazer qualquer coisa, pode começar pela cidade fazer hunt pequenas etc, essa é minha dica.1 ponto
-
MINHA HISTORIA NO XTIBIA
Session Start reagiu a Subwat por um tópico no fórum
skydangerous 5 anos no forum, ninguem suporta ele, parece um pirralho falando, e se acha com bens materiais que nao tem ou que tem com o dinheiro do pai, tem monocelha, tem um fake no facebook de uma loira que nunca viu na vida, e é virgem alem de tudo. que massa esse user.1 ponto -
We do Scripting e a volta do SDS
Demonbholder reagiu a comedinhasss por um tópico no fórum
Demon, se quiser acesso ao antigo svn é so avisar... Muito bom o projeto, ultimamente ninguém tem mais idéia pra script...1 ponto -
Notice System
Demonbholder reagiu a comedinhasss por um tópico no fórum
Versão do Script: V0.1 By Comedinha Versão testada: 9.4+ (pode funcionar em versões anteriores). Descrição: Quem não se lembra do velho Notice System feito pelo esk? Aquele que toda a noticia nova você tinha que abrir o txt e escrever nele as novidades? Agora não precisa mais disso. Nota: O script no momento está mais parecido com um ticker system do que um notice system. Novas Funções: - Adicionar noticias em tempo real para todo o servidor com a data. - Limpar a janela de noticias em tempo real para todo o servidor. TAG: <talkaction words="!notice;!news;/notice;/news" event="script" value="notice.lua"/> Script: local config = { add = {"add", "adicionar", "new"}, clean = {"clean", "limpar"} } function onSay(cid, words, param, channel) local t = string.explode(param, ",") if(table.isStrIn(param, config.add)) then if getPlayerGroupId (cid) >= 5 then file = io.open('data/txt/notice.txt','a+') if(param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.") return true end notice = file:write("\n"..getPlayerName(cid).." at " .. os.date("%d %B %Y - %X ", os.time()) .."\n"..t[2].."\n") file:close() return true end elseif(table.isStrIn(param, config.clean)) then if getPlayerGroupId (cid) >= 5 then file = io.open('data/txt/notice.txt','w') if(param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.") return true end notice = file:write("Server News\n") file:close() return true end return false end file = io.open('data/txt/notice.txt','r') notice = file:read(-1) doShowTextDialog(cid, 7528, notice) file:close() return true end Aviso: Na pasta data crie uma pasta chamada txt e dentro dela um arquivo chamado notice.txt. Após a instalação do script dentro do servidor digite /notice clean para não ter problemas futuros. Como usar: Para ver as noticias digite /notice Para adiconar noticias digite /notice add, (texto) Para limpar a janela de noticias digite /notice clean Créditos: Esk Comedinha (Bruno Carvalho)1 ponto -
Notice System
Demonbholder reagiu a comedinhasss por um tópico no fórum
Sim sim, ele tem um limite de 5 noticias para parar de funcionar e ser necessário usar o clean.1 ponto -
[Tutorial] Paredes
Daniel Bighouse reagiu a Gears por um tópico no fórum
Cara, antes de falar certifique-se de que não está falando nada errado, meu comentário sobre o spoiler foi 18:29, e ele editou o topico 18:40, ou seja ele CORRIGIU o spoiler,1 ponto -
1 ponto
-
Player Check System
Demonbholder reagiu a comedinhasss por um tópico no fórum
Vlw cara, eu estou usando ele no atual Alissow Server também... Em breve quem saiba novas atualizações, com novas funções...1 ponto -
[8.54+] Player Online Spoof
Demonbholder reagiu a comedinhasss por um tópico no fórum
Sim, fica o valor que você colocar no config.lua. No meu servidor eu testei e ficou com 100 extra. É uma atualização do: http://www.xtibia.com/forum/topic/87437-player-online-spoof/1 ponto -
Returning Talkaction
Demonbholder reagiu a Skymagnum por um tópico no fórum
Tipo: Talkaction. Testado: Não. Breve explicação É uma talkaction, que serve para que quando você está morrendo você use ela, e então quando você morrer, você fala !return, e volta para aonde você morreu ou salvou, é simples assim. Fácil configuração Primeiro vá em data depois em lib e em seguida na pasta 050-FUNCTION então adicione isso lá: MAIN_CONFIG = { POSITION_STORAGE_X = 10090, POSITION_STORAGE_Y = 10091, POSITION_STORAGE_Z = 10092, STORAGE_CHECK = 10093, STORAGE_TIME = 10094, MESSAGE_WAIT = "You need wait " .. getPlayerStorageValue(cid, MAIN_CONFIG.STORAGE_TIME) - os.time() .. " seconds.", MESSAGE_SAVE = "You sucefully save your position, if your down say !return.", MESSAGE_RETURNING = "You has been teleported for you save position", MESSAGE_BATTLE = "?", MESSAGE_PROTECTION = "?", MESSAGE_USING = "?", } e isso também: function resetStatusInTime(cid) local P_ID = getPlayerGUID(cid) local PLAYER = getPlayerByGUID(P_ID) addEvent(function() if isCreature(PLAYER) then setPlayerStorageValue(PLAYER, MAIN_CONFIG.STORAGE_TIME, 0) setPlayerStorageValue(PLAYER, MAIN_CONFIG.STORAGE_CHECK, 0) else db.executeQuery("DELETE FROM `player_storage` WHERE `key` = 10093 AND `player_id` = " .. getPlayerGUID(PLAYER) .. ";") db.executeQuery("DELETE FROM `player_storage` WHERE `key` = 10094 AND `player_id` = " .. getPlayerGUID(PLAYER) .. ";") end end, 360 * 1000) end Não mecha em nada que não tenha MESSAGE agora vá na pasta talkactions crie 2 arquivos um chamado returnPos e coloque isso dentro: function onSay(cid, words, param, channel) local RETURN_PLAYER_POS = {x = getPlayerStorageValue(cid, MAIN_CONFIG.POSITION_STORAGE_X), y = getPlayerStorageValue(cid, MAIN_CONFIG.POSITION_STORAGE_Y), z = getPlayerStorageValue(cid, MAIN_CONFIG.POSITION_STORAGE_Z)} if getPlayerStorageValue(cid, MAIN_CONFIG,STORAGE_CHECK) > 0 then if getCreatureCondition(cid, CONDITION_INFIGHT) then if getTileInfo(getThingPos(cid)).pz then doTeleportThing(cid, RETURN_PLAYER_POS) doPlayerSendTextMessage(cid, 27, MAIN_CONFIG.MESSAGE_RETURNING) setPlayerStorageValue(cid, MAIN_CONFIG.POSITION_STORAGE_X, 0) setPlayerStorageValue(cid, MAIN_CONFIG.POSITION_STORAGE_Y, 0) setPlayerStorageValue(cid, MAIN_CONFIG.POSITION_STORAGE_Z, 0) setPlayerStorageValue(cid, MAIN_CONFIG.STORAGE_CHECK, 0) setPlayerStorageValue(cid, MAIN_CONFIG.STORAGE_TIME, 0) else doPlayerSendCancel(cid, MAIN_CONFIG.MESSAGE_PROTECTION) end else doPlayerSendCancel(cid, MAIN_CONFIG.MESSAGE_BATTLE) end end return true end e o outro savePos e coloque isso dentro: function onSay(cid, words, param, channel) if getPlayerStorageValue(cid, MAIN_CONFIG.STORAGE_TIME) <= os.time() then if getPlayerStorageValue(cid, MAIN_CONFIG.STORAGE_CHECK) <= 0 then setPlayerStorageValue(cid, MAIN_CONFIG.POSITION_STORAGE_X, getThingPos(cid).x) setPlayerStorageValue(cid, MAIN_CONFIG.POSITION_STORAGE_Y, getThingPos(cid).y) setPlayerStorageValue(cid, MAIN_CONFIG.POSITION_STORAGE_Z, getThingPos(cid).z) doPlayerSendTextMessage(cid, 27, MAIN_CONFIG.MESSAGE_SAVE .. "You have 360 seconds for this.") doSendMagicEffect(getThingPos(cid), 28) setPlayerStorageValue(cid, MAIN_CONFIG.STORAGE_CHECK, 1) setPlayerStorageValue(cid, MAIN_CONFIG.STORAGE_TIME, os.time() + 360) resetStatusInTime(cid) else doPlayerSendCancel(cid, MAIN_CONFIG.MESSAGE_USING) end else doPlayerSendCancel(cid, MAIN_CONFIG.MESSAGE_WAIT) end return true end qlr erro posta ai, fiz rapido o script e o topico tbm, ent vlw flws, se ti tbm sapora ai foi mals, vlw flws, ta lgd, flws e vlw.1 ponto -
Returning Talkaction
Demonbholder reagiu a Skymagnum por um tópico no fórum
Ficaria tipo assim então: local pos = getPlayerPosition(cid) local tablePos = {x = pos.x, y = pos.y, z = pos.z} setPlayerStorageValue(cid, 3500, tablePos) sinceramente acho que isso não funciona1 ponto -
Returning Talkaction
Demonbholder reagiu a Skymagnum por um tópico no fórum
Fiz mais só pra zuar mesmo, não curto muito gmatch eu usaria gsub: setPlayerStorageValue(cid, storagePos, ":".. p.x ..",:".. p.y ..",:".. p.z) pra checar local pPos = tostring(getPlayerStorageValue(cid, storagePos)):gsub(':', ''):explode(',') pPos[1] -> x pPos[2] -> y pPos[3] -> z1 ponto -
[Encerrado] Dat Editor Para Tibia 8.54
narutomaniacos reagiu a danilinho79 por um tópico no fórum
Cara, isso ele sabe né, o problema é com a versão, se liga ¬¬. Vou tentar ajudar dnv... me adiciona no msn: danilinho79@hotmail.com aí eu te mando o meu dat editor, que eu tb uso no meu servidor 8.541 ponto -
Caro , GaaLol. Já lhê pedi pra não fazer pedido tão loucos. Se você quer um igual o ExTNL terá que pagar para conseguir não há dúvidas nisso. Porém é como o Raidou falou. Você tem que procurar por servidores bons aqui mesmo na XTIBIA , Ai você monta um projeto e faz a equipe e vai aos poucos mano. Caso queira completo procura por quem venda essas coisas , Ai vai ser em uma barbada...1 ponto
-
[Pedido] Executavel Compilado Com O Anti Divulguer
Demonio007 reagiu a gonorreiaswat por uma questão
Então, você até que deu sorte... Pois o "MatheusMKalo" criou um tópico sobre. Segue abaixo o link: http://www.xtibia.com/forum/topic/162138-anti-divulgacao-de-otservers/ Espero que te ajude... Abraços :smile_positivo:1 ponto