Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 03/19/14 em todas áreas

  1. Começando bem em um mundo novo! Tudo bem gente? Sim! Ótimo! Vim aqui trazer essa forma de se dar bem no Tibia Global (pra mim deu certo), eu mesmo fiz ele, o tutorial é pra low level pois tudo que você ver abaixo foi de minha experiência. Só pra esclarecer. - Esse é um tutorial para quem tem Premium Time, porém você não vai precisar colocar nenhum Premium Scroll no jogo para vender. - Não é um tutorial para rushar na velocidade da luz, nem tanto para parar no tempo, você upa talvez um pouco mais lento que o normal (depende de quantas horas você jogar). Entretanto, o lucro fica maior que o normal (pra quem não vende premium scrolls). Em Rookgaard Tudo começa quando você cria seu char, level 1 e tal. Em rook não se preocupre muito com a grana, eu vou mostrar o jeito que eu jogo, acredito que seja uma boa maneira, com o objetivo de não ficar muito tempo em rook. - Não de skip no tutorial, é chatinho mas você já entra em rook no level 2. - Lembra da ultima parte do tutorial quando você tem que pergar food pra vender e aprender a usar o trade? Então, nessa parte eu já faço a minha primeira parte pra começar bem em rook, eu simplismente coleto o máximo possível de food, até ficar sem cap, se eu me lembro bem da pra fazer uns 40gp, com isso você já compra um Leather Helmet e um Wooden Shield, pode não parecer dar muita diferença, mas da sim em! - Seu primeiro local de caça vai ser os Rats da área premium, mesmo com o set que eu falei acima, não abuse dos ratos, sempre que possível pegue os Rats de 1 em 1. Não vai demorar pra você pegar o level 4. Com a grana feita, compre uma armor, uma legs qualquer, compre o que der. - Embaixo dos ratos existe uma pequena subcave com Bugs, porém você não guenta muito bem 2 bugs. porém há na cave 2 locais que você se trapa e apenas um bug fica te atacando, procure entrar nessa subcave com sua life no máximo, pois mesmo com 1 bug você vai levar porrada, o segredo é que você vai upar antes de morrer! Sua vida volta ao 100% antes de morrer hehe. Não esqueça de pegar os golds, o nível 5 vem em questão de 10~15 minutos. - Se você tiver um Leather Helmet, Leather Armor, Leather Legs, Wooden Shield e um Sabre, não precisará mais gastar com set, já está razoável, guarde toda a grana, NÃO GASTE! - Com esse set e o level 5~6 alcançado, está na hora de você ir para a parte oeste da área premium de Rook! La você vai encontar várias pequenas caves e pequenas montanhas com wolfs, além de uma cave de snake (não despreze-a). A tática com todos eles é simples, no seu controle de combate, não deixe em full attack, coloque o "escudo-espada" , e não deixe o seu char correr atras da criatura, pois o wolf foje no red, isso é bom, porque quando você entrar na cave, uns 3 ou 4 wolfs vão estar te esperando, vá deixando um a um no red, para depois matá-los. Importante: Sempre quando você ficar no red, suba para a ponte que divide essa área oeste de hunts, e fale com o NPC Dallheim, e sempre coma aqueles bushes de blueberries que você encontar pelo caminho. (parte oeste de rook) - Fique lá até pegar o level 8, demora uns 40 minutos mais ou menos... - Depois de upar o nível 8, você já pode sair de rook, escolher sua vocação, e como você é premium, vá descansar (por 12 horas), deixe no offline training o máximo de tempo, provavelmente você voltará a jogar no seu char somente no dia seguinte. Em Mailand A coisa fica massa agora, saímos de rook, com o offline training seu skill vai estar legal (melhor do que nada), porém é agora o tutorial se divide na parte do lucro, quem mais vai ficar com grana vai ser os knights, por motivos já conhecidos por todos mas que vale relembrar: Knight não gasta tanto quanto as outras classes (paladin gasta muito em spear, mages em mana potions, os knight gastam só com health potions, e só gasta em emergências). - Sobre as hunts, eu prefiro começar em um lugar mais tranquilo, não gosto muito de rots em darashia, ou larvas em ankrahmun, o bom mesmo é comçar em trolls, sim, TROLLS! Pergunta: Mas João, a xp do troll não se compara com a de um rot, por que caçar aí? Resposta: De fato meu caro, mas o que você prefere? Ir em um lugar lotado de gente (as vezes até botters), ou ir em um lugar que você sabe que é mais vazio? (raro de encontrar alguém). - A ocupação é um fator importante na xp/hora, e também, quem não fica desanimado em um lugar cheio de gente dando ks nos seus bichos? - E a xp não fica tão baixa, a cave de trolls de edron é lurada, você entra na cave, vem uns 4 trolls e mais um troll champion. 20k/hora você pega sem muitas dificuldades. - Antes de ir caçar nos trolls, pegue a task do Daniel Steelsoul, ele irá lhe pedir para matar 100 trolls, a recompensa é de 200gp (não é muito mas é melhor que nada). Você faz a task em 30 minutos. - Outro ponto positivo nas diferenças Trolls de Edrons x Rots de Darashia é o perigo, em Darashia, 4 rots podem te dar dor de cabeça no level 8, já uns 6 Trolls em Edron não são nada de mais. Como chegar na hunt dos Trolls? Partindo do DP, vá até o local marcado com um losango e desça o bueiro, depois disso não tem erro, vão ser vários caminhos únicos até você sair la na estrela. A área circulada é a entrada da cave. Depois de fazer a task, reporte a Daniel, entregue a task , e pegue a task dos goblins, que da mais xp/hora, e não é perigosa também, a diferença é que você terá que matar 150 goblins, o prêmio de golds aumenta para 250gps. Como chegar na hunt dos Goblins? Mesmo caminho dos trolls, porém a cave dos goblins se localiza no sul. - Fique nos Goblins até o nível 14~16. A partir desse nível você pode chegar nos Rots de Darashia, ou Larvas de Ankrahmun, porém como eu já falei, são lugares que todo mundo vai, isso tira o potêncial de xp e lucro, eu prefiro caçar nos Rotworms de Edron, é um lugar um pouco menor, pode dar uma exp menor (ou não), mas é um lugar bom, pode demorar mais pra você upar (ou não), o lucro fica em volta de 400gp por cada volta completa na hunt. Eu fico aí até o level 20, se você ficar aí até esse nível, o seu balançe vai ficar bom, principalmente pros knights (cerca de 3~5k). Clique aqui para saber mais sobre a hunt. Nível 20 Você chegou ao nível 20, parabéns! mas, e agora, como fica a promotion? Você precisa de 20.000 gold coins e não tem metade desse valor, porém existe as quests para ajudar você a chegar nesse valor. Vamos deixar esses 3k de fora (guarde para supply e viagens) - Desert Quest = 10.000gps - Arito Task Quest = 5.000gps - Nomad Land Quest = 5.000gps - Custos para fazer a Arito Task Quest = 3.000gps (não pague mais do que isso) Isso já daria os 20.000gps, porém na arito task você precisa comprar uns itens necessários para fazer a quest, como uma Scimitar e um Nomad Parchment, as vezes eles podem chegar a valores absurdos, eu pago no máximo 3k nos dois juntos (não pague mais do que isso). Supondo que você fez tudo isso, e que conseguiu esses 17k. Faltou 3.000gp. Agora é que você vai ter que lucrar o resto caçando. Larvas é um bom lugar, não pense na xp, pois o local pode estar lotado. Enquanto ao supply, leve apenas o básico, potions, food nem precisa pois larva dropa muito meet. Quando chegar aos 20k, fale com o King Tibianus (Thais) ou a Queen Eloise (Carlin). Só mais uma coisa, se você tiver grana suficiente, compre seu bless, ou junte até grana até o nível 24 e faça a Pilgrimage of Ashes Quest, com essa quest o seu bless sai mais barato! (não é tão bom para players nível 25 ou mais). Você irá gastar 5k no total (mais as viagens), leve umas 10 health potions para fazer a quest, pois você irá passar por vários fire fields em um dos NPCs de bless. Mesmo com o bless, nunca se arrisque, se você ver que a coisa ta feia, fuja! Se não conseguir, faça grana em um lugar tranquilo e compre novamente o bless, nunca permaneça sem bless, pois morrer e perder algum equipamento não é nada legal, nem que seja uma plate legs. Agora você está no nível 20~22, e seu skill deve estar razoável, espero que sempre deixe 12 horas diárias trainando offline (sendo assim os knights devem estar com melee 60+, paladins 65+, e mages com ml... bem eu não tenho certeza, mas uma ml 25+ deve estar né!). Agora onde eu vou caçar? E nesse ponto que eu gosto de a fazer tasks, faça as três de crocodilles, da um lucro bom até, e a xp é boa, 20k/hora ou até mais. Crocodilles são fracos, se você for no andar das tartarugas, só tome um pouco mais de cuidado, porque elas são chatinhas, além do local ser um pouco mais lurado. A hunt se localiza em Port Hope, acho que todo mundo conheçe. (o circulo é a entrada) - Que nível pegou? se você estiver por volta do nível 25~27 já vai ficar bom. Até o level 30, você pode escolher aonde quer lucrar, em rot ou nos próprios crocodilles, pode ir nos scarab em ankrahmun (ficam abaixo das caves de larvas), fique a vontade. Nível 30, ta ficando bom... Pegando o Nível 30 está na hora de fazer algumas quests para você fazer uma graninha extra! São missões que passam despercebidas, não tem aquele lucro que vai pagar suas hunts, mas me ajudou e acredito que possa ajudar vocês, se não querer fazer alguma das quests, fique a vontade, segue a lista: - The Exterminator Quest: Aquela quest que você deve ir nos esgotos de Carlin, extremamente fácil, só encontará 2~3 slimes (não contando os summons), o lucro não chega a 1k, eu fiz porque eu não consigo não fazer, cara, isso paga umas 5 viajens! (se você acha que não faz muita diferença pra você, fique a vontade para não fazer). Recompemsas: 1 Small sapphire, 1 small ruby, 1 small amethyst e 1 small emerald. - The Ultimate Booze Quest: Também da pra se fazer bem antes, mas eu prefiro deixar pra fazer essas quests todas juntas, uma atras da outra, o lucro também não é o mais alto, mas de grão em grão... .Você só precisa falar com um NPC encima do dp de Venore, ele lhe entregará uma garrafa que você terá que encher ela em Kazordoon, e devolver ao NPC de Venore. Recompensas: Uma light shovel (fique com ela, não venda), 1.000gps e 100 pontos de xp. - Sea of Light Quest: Essa é um pouquinho mais difícil pela demora, você fala com uns NPCs, mata uns bichos. O lucro é um pouquinho maior que as outras quest que eu disse. Recompensas: 1.500 pontos de xp, 10 small diamonds e 1 Yellow Gem. Você aguenta todas as criaturas desses três quests sem problemas, eu mesmo não usei nem 5 health potion no meu kina. O Lucro das 3 quests juntas vai dar uns 5.000 gold coins mais ou menos, é alguma coisa, já que esse tutorial é pra quem é da humildade A respeito dos equipamentos, compre o que for possível: Knight: K Armor, K Legs, Crown Helmet, Dragon Shield, Arma do Nível// Paladin: Paladin Armor, Blue Legs, Crown Helmet, Dragon Shield, Royal Spear. Mages: Crown Helmet, Spirit Cloak, Plate Legs, Dragon Sehield, Wand/Rod do nível / Deixem para comprar a Knight Legs por último, se não sobrar grana, não se preocupe muito, pois você vai lucrar mais a partir de agora. A diferença de defesa da plate pra knight é de 1. Além dessas quests, há uma quest diária que você pode fazer, chamada Rottin Wood and the Married Men Quest, você pode fazê-la de 20 em 20 horas, existe uma remota chance de ganhar um Hunting Horn! ISSO MESMO, UM HUNTING HORN. Se você der uma cagada dessa, esqueça as hunt para fazer lucro, faça exatamente o contrário, waste! (não é facil, mas não desista!) Também há outra forma de conseguir um lucro extra, que é a chance de você droprar um Leech (item para domar o Water Buffalo). Você pode tentar "pescar" o item uma vez por semana. Para isso você precisa ir em um determinado sqm de swamp e usar a sua shovel nele. (Infelizmente eu não consegui o leech ) Aonde caçar agora? - Foi nesse nível que eu fiz as minhas 3 task de mammoths junto com as 3 de badgers. Aqui você lucra legal, eu fiz muita grana, ainda em 1 dos bosses dropou o querido Red PoC (vendi no market por 24k). - Em uma dessas task você consegue grana pra comprar a Knight Legs. - Eu upei do 30 até o 37 em tasks, porém era tempo de double exp, então provavelmente você irá pegar um nível 34. - Com a grana final dessas tasks, você ficará bem na fita! Se for mage, compre uma Focus Cape, se for paladin, compre uma Paladin Armor, o resto deixem como está. - Depois da task de Mammoths, é uma boa fazer a task de tarantulas. É uma task que lucra um pouco menos que os Mammoths, porém você faz ela muito rápido, a exp/hora fica bonita, eu já cheguei a fazer 35k/hora com bônus, eu acho uma xp legal. - O lucro do boss é agradável, veja: 0-7 platinum coins, 0-4 spider silks Knight Legs, Steel Helmet, Terra Hood, Time Ring. Então, você acha que não vai lucrar? Creio que depois de fazer essas 3 task, você vai upar 3 níveis, supondo então que esteja no nível 37, chegamos a mais um ponto que se diferencia entre as classes, pois, se você for Paladin ou Mage, você poderá fazer a task de Carniphilas, não é difícil de se matar, só é triste para os knights, pois essa platinha tem um bom melee. Para os Knights eu recomendo ir nos Cyclops de Cyclopolis (com cuidado), ou pode ir em scarabs, ir nas tumbas (apenas nos dois primeiros andares), mas se você for um jogador muito profissional, tente ir nas carniphilas mesmo. Fique nessas hunts até o nível 40. Nível 40 É o lindo nível 40, eu gosto desse nível, pois você a um passo dos 1.000.000 pontos de experiência. Nada de novo aqui, a tática são as mesmas, tasks, quando não tiver task pra fazer, lucre. - A Task de Terramite é perfeita para knights, fácil, exp rasoável, graninha legal, eu não recomendo muito para mages (pelo fato dos espaços estreitos), mas eu tentaria caçar la. Já vi um paladin caçando lá. Faça essa task na cave de Ankrahmun. Para saber mais clique aqui. Fazendo essa task 3x, você pegará uns 2 níveis, apenas isso, triste. Então você deve estar por volta do nível 42. Aqui fica aberto, até o nível 50 eu não fiz mais nada além de caçar (caçei em Cyclopolis, e nos próprios Terramites), porém eu esqueci que por volta do nível 45 já era tranquilo fazer a task de carniphila, fica a dica para os Elite Knights. Outro lugar que eu esqueci que poderia caçar era nos Mutated Humans, mesmo não valendo tanto assim (já que o lugar é lotado), o lucro é bom e a xp pode ficar boa. Essas hunts servem para Paladins e Mages também. - Para os Mages, especialmente os sorcerers, nesse level 42, vocês podem se arriscar a caçar Earth Elementals em Edron, lucro bonzinho, xp melhor ainda. Pode ir, aconselho não ir no andar dos Bog Raiders para os menos experientes, eu já vi um sorcerer nível 33 caçando lá, ele me disse que tinha ml 57, então é de se perceber que ele ficou no offline training por um bom tempo, o que não acontece no nosso tutorial. - Mais uma coisa que eu tinha esquecido e vocês podem fazer, a Troll Sabotage Quest (que lhe da a elvenhair rope). Nível 50 Ao respeito dos equipamentos: Knight: Crusader Helmet, Crown Armor, Zaoan Legs, Zaoan Shoes, Vampire Shield, Arma do Nível// Paladin: Crusader Helmet, Paladin Armor, Zaoan Legs, Zaoan Shoes, Vampire Shield, Royal Spear. Mages: Hat of The Mad, Focuas Cape, Zaoan Legs (Blue Legs se preferir), Zaoan Shoes, Vampire Shield, Wand/Rod dos nívels 33, 37 e 42 //// Até agora eu não tinha falado sobre as spells, mas acho que é óbvio dizer que é pra comprar todas elas, não deixe pra depois, eu sempre consegui comprar na hora, ou em 1, 2 níveis depois. A melhor coisa aqui são as novas tasks, principalmente a de Killers Caimans ( *-* ). Tudo bem que ela é infinitamente melhor para knights, mas eu já vi paladin caçando lá, mages tbm. Eu já não estava mais com a exp bônus, mesmo assim, upei do 50 até o 57. O meu lucro passou dos 100.000gps, então não se preocupe em gastar um pouco mais com pots, pois o Killer é perigoso nesse nível, todo cuidado é pouco, e a experiência/hora é absurda, eu já fiz 120k/hora (com bônus, sem double e com 1 knight 120 na cave). [saiba mais sobre os Killer Caimans aqui!]. Quando tiver grana, compre uma BoH. - Para os Mages: Se não conseguirem de forma nenhuma caçar nos caimans (o que é bem provável), não forçe a barra (para não morrer). Qual seria o Killer Caimans dos mages? Os Water Elementals, um lucro um pouco menor, uma exp maior, e mais fácil para os sorcerers e druids. Deixe para conseguir os task points em uma outra ocasião. - Fiquem nos killers até fazer as 3 task, pros mages, fiquem nos waters até mais ou menos o level 55. - Depois disso, é hora de fazer 3x a task de Ancient Scarabs! Essa task é voltada para tentar a sorte de conseguir um Ornamented Broch (200k +/-). Porém a exp é rasoável, podendo upar uns 3 nívels mais ou menos. - Pra quem não chegar ao nível 60, faça suas hunts nos Waters e Killers, até alcançar o 60. (Não hesite em vir nessas hunt, são ótimos locais para níveis 60,70,80,90...) - Se estiverem muito lotadas e vocês não gostarem, sempre existe os clássicos Dragons para se caçar; Yalahar, Darashia, tanto faz. - Os Knights tem também a opção de fazer a task de Mutated Tiger em Yalahar se preferirem. Creio que também seja boa para Paladins. - Os Mages podem arriscar também ir nos Bog Raiders de Edron, aqueles que eu falei que ficam juntos com os Earths. Nível 60 A respeito dos equipamentos: Knight: Zaoan Helmet, Golden Armor (se tiver grana pode comprar um DSM), Zaoan Legs, Demon Shield, BoH, Arma do Nível // Paladin: Zaoan Helmet, Paladin Armor, Zaoan Legs, BoH, Demon Shield, Arma do Nível // Mages: Hat of The Mad, Focus Cape, Zaoan Legs, BoH, Wand/Rod (tenham as de death e as do 65, se não custarem muito!)//// Hunt de ZOMBIES! - Ótima hunt de Liberty Bay, caçe sempre com stealth ring (pois você não aguenta 4, 5 zombies, o que não é difícil de se encrontrar). Quer saber como caçar nos Zombies? Clique Aqui! - Para os Mages eu aconselho continuar principalmente no Water Elementals, é o que há, upa muito rápido, só tenha cuidado, esse bicho é desgraçado. - Se você quer lucrar MUITO, vá nos pirates de Liberty Bay, e faça a task, demora, mas os loots dos boses fazem valer a pena. Esse tutorial acaba por aqui, na casa do 60, por que? R: Porque foi até aí que meu char no Global chegou até agora (64 pra ser exato), eu pretendo atualizá-lo de acordo com as novas coisas que eu ir aprendendo, níveis que eu ir upando, dicas que vou seguindo, e assim vai... Não se esqueça: - Nunca fique sem bless. - Nunca perca sua esperança de dropar um Hunting Horn. - Sempre tente pegar um Leech. - Se tiver sem opção de caça, lucre em locais mais fracos. - Offline Training sempre, 12horas por dia e você terá um skill bom com o tempo. - Sempre que puder, economize seu gold, faça todas as quests possíveis. Esse pode não ser o melhor jeito de se começar em um novo mundo, mas creio que seja uma maneira positiva, e tranquila, sem aquele compromisso de rushar, vai jogando e se divertindo, na tranquilidade, humildade. Críricas, sugestões, fiquem a vontade!
    4 pontos
  2. Eae galerinha do xtibia, vim aqui hoje para ensinar uma coisa simples, mas que muitos nao sabem, e queriam aprender de uma forma bem facil. Vou ensinar á criar spells básicas de damage, de area, e alvo unico... Primeiro, irei ensinar uma de alvo unico. Vá em data/spells/scripts copie um arquivo .lua e renomeie para o que desejar: Verde: é o tipo do dano, seja physical, fire, earth, ice, energy, lifedrain, manadrain, etc... setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 22) Vermelho: é o numero do efeito que irá até o alvo, voce pode escolher usando o comando "/x" setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -120.2, 1, -125.2, 1) Roxo: é o dano minimo, e maximo da spell. Baseado no level. doSendMagicEffect(position1, 196) Azul claro: Efeito que vai dar no target, quando o efeito "22" bater nele, voce pode escolher pelo comando "/z" E agora, vamos colocar sua spell no spells.xml: <instant name="Nome da spell" words="Nome da spell" lvl="Level necessario" mana="mana que ira gastar" aggressive="1" range="7" blockwalls="1" needtarget="1" exhaustion="1500" needlearn="0" event="script" value="Nome do arquivo.lua"> <vocation id="id da vocaçao"/> Agressive: se for para dar dano coloque "1" se nao for apra dano coloque "0" Blockwalls: se o jutsu pode atravessar paredes coloque "0", se nao atravessar coloque "1" Needtarget: se precisa estar atacando coloque "1" se nao, coloque "0" Exhaustion: Tempo de exalst, 1500 = 1,5 segundos. Bem, fazendo tudo isso certinho, sua spell estará pronta, agora vou explicar uma spell simples de area. ---------------------------------------------------------------------------------------------- Copie qualquer arquivo, e renomeie para o que desejar. Vou utilizar um script bem simples que eu criei agora, só para demonstraçao. local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, 214) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -93.5, 1, -106.5, 1) arr1 = { {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0} } local area1 = createCombatArea(arr1) setCombatArea(combat1, area1) local function onCastSpell1(parameters) return isPlayer(parameters.cid) and doCombat(parameters.cid, combat1, parameters.var) end function onCastSpell(cid, var) local position1 = {x=getCreaturePosition(cid).x+2, y=getCreaturePosition(cid).y, z=getCreaturePosition(cid).z} local parameters = { cid = cid, var = var} addEvent(onCastSpell1, 100, parameters) return TRUE end setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) Essa parte, como expliquei na spell anterior, apenas mude o tipo de dano, á seu gosto. setCombatParam(combat1, COMBAT_PARAM_EFFECT, 214) Aqui, voce muda o efeito, que está o numero 214, voce pode modificar, vendo os numeros pelo comando "/z" setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -93.5, 1, -106.5, 1) Aqui, voce escolhe dano minimo e máximo, baseado no level. arr1 = { {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0} } Essa seria a area da spell, os numeros: 3: local onde o player que executou a spell irá estar. (sempre no meio) 1: local onde sairá a spell, ou seja, onde ira sair o efeito, e ira dar dano. 0: nao sairá nada Agora, vamos coloca a tag da spell em spells.xml: <instant name="Nome da spell" words="Nome da spell" lvl="level necessario" needtarget="0" mana="mana que ira gastar" aggressive="1" exhaustion="1600" needlearn="0" event="script" value="Nome do arquivo.lua"> <vocation id="id da vocaçao"/> O resto ja expliquei na spell anterior. Bem galera, por enquanto é isso, muito simples né.. Estou aceitando criticas e dicas para o topico, que eu estarei editando... e, em breve farei um tutorial mais aprofundado .... Se gostou nao esqueça de deixar seu rep
    3 pontos
  3. Madarada

    [Tutorial] Outline

    Olá Xtibianos,meu nick é Madarada e hoje venho lhes trazer um tutorial básico de spriting.Pretendo elevar o nível de nossos spriters e por isso todos os meus tutoriais serão minuciosamente detalhados do começo ao fim.Algumas pessoas podem achar este tutorial desnecessário e muito simples,porém vamos lembrar que muitos membros estão iniciando e não sabem por onde começar então vamos engatinhando até aprender a andar e talvez até correr. Enjoy. Antes de começarmos quero deixar claro que : Neste primeiro tutorial iremos abordar um assunto muito importante que se chama outline.Futuramente virão tutorias de outline de monstros,armas,cenários mais por enquanto apenas humanóide. - Outline - (humanóide) # Outline o que é ? Outline do inglês (linha de fora) é o contorno do sprite l - Criando uma base - Primeiramente devemos localizar e abrir o Ms paint do windows,ele será nossa ferramente principal e nós ajudará em nossa jornada. - Antes de começarmos devemos habilitar nosso abiguinho "miniatura" ele fica no canto superior como na imagem abaixo.Com ele habilitado podemos usar a lupa em resolução máxima e ter uma visão de como está ficando nosso sprite: - Em seguida selecione uma sprite para usar como base,eu uso o citizen por ser bem simples contudo,algumas pessoas preferem fazer uma outline do zero o que eu acho que para um iniciante um tanto avançado.Seguindo o exemplo do citizen pinte o todo de vermelho (por ser uma cor bem saturada para diferir da roupa do citizen) porém, sem atingir as linhas principais que separam as pernas,cabeça,braço e olhos como no exemplo: - Feito isso contorne as linhas as principais de preto (são as linhas contornadas de verde) para limpar o sprite.Pinte a parte interna da arte de branco como no exemplo. ll - Aprimorando sua base - Agora temos nossa base,porém ela ainda é um citizen então iremos criar o nosso próprio personagem.Para isso precisamos nos basear em alguma imagem (se você tem o dom de desenhar pode criar uma roupa para sua base e pular esta parte).Vamos nos fixar em fazer os detalhes mais básicos,por isso eu peguei está de um camponês medieval bem simples: - Como próximo passo iremos analisar a roupa do campones e tentar reproduzi-la em nossa base.Para facilitar iremos copiar a imagem do campones para dentro do paint e coloca-lo de canto,dessa maneira podemos observar a todo instante se a reprodução da imagem está correta: - Iremos começar pelo cabelo,essa parte pode ser fácil falando,mais deve ser feita com atenção para um bom resultado mais tarde.Primeiramente iremos selecionar a cor azul e fazer um rabiscado de cabelo caindo sobre os ombros,aos poucos vamos adaptando ele á cabeça e criando forma. - Na sequência,devemos tirar a margem de erro melhorando o cabelo e arredondando-o de uma maneira coerente à nossa imagem.Os pixels vermelhos devem ser removidos e pintados de branco,e os pixels verdes devem ser adicionados e pintado de azul.Segue abaixo um ilustrativo: - Após feito isso devemos colorir a margem de preto para tornar o cabelo parte da outline.Em rosa estáo os pontos aonde devem ser adicionado os pixels preto: - Com o cabelo terminado agora iremos direto para a cota de malha e mangás da roupa. De início iremos fazer uma blusa na parte superior do corpo. - Com a primeira parte da cota de malha pronta seguiremos para a segunda parte.Vamos começar fazendo pequenas alças nos extremos da blusa,cor cinza para podermos diferir as partes da malha.Aos poucos vamos prenchendo e seguindo com uma gola V. - Finalizando iremos terminar a calça e a bota.Fazendo um traçado curvado vamos dando forma á bota e dividindo a calça. - Por fim adicionamos detalhes na bota dando um pouco de volume e melhorando sua aparência lll - Detalhes Finais - Usando o conta gotas conseguimos pegar o tom da cor exata da roupa do camponês - Finalmente está pronto nossa primeira outline de humanóide Esse foi o #l tutorial básico de spriting (outline) Se gostou da um rep ae tio Até mais próximo tutorial #ll tutorial básico de spriting (perspectiva) Este tutorial foi feito por Madarada Postado em 14.03.2014
    3 pontos
  4. Zoobu

    Galeria [Keviz]

    Ola! Bom, já tinha esse Zoro há algum tempo já. Ta meio gordo... ------------------------------ Ino, como n é pra uso livre decidir n postar a sprite. #Vou tentar terminar o Madara que comecei...
    3 pontos
  5. caotic

    TV System by caotic

    Eae galeerrra xtibiana. Venho disponibilizar o famoso sistema de televisão poketibiano completo o sistema foi feito para ambos os clients tibianos. O sistema permite você assistir outro players jogando assim você fica sem usar itens,falar(so pm), se movimentar e etc... Vamos la: Vá em luascript.cpp e procure: int32_t LuaScriptInterface::luaGetTopCreature(lua_State* L) { //getTopCreature(pos) PositionEx pos; popPosition(L, pos); ScriptEnviroment* env = getEnv(); Tile* tile = g_game.getTile(pos); if(!tile) { pushThing(L, NULL, 0); return 1; } Thing* thing = tile->getTopCreature(); if(!thing || !thing->getCreature()) { pushThing(L, NULL, 0); return 1; } pushThing(L, thing, env->addThing(thing)); return 1; } E coloque embaixo: int32_t LuaScriptInterface::luaGetAllsTvs(lua_State* L) { //getAllsTvs(cid) ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } Tvlist::iterator it; it = player->tv.begin(); lua_newtable(L); uint32_t tableplayers = 1; for(uint32_t i = 1; it != player->tv.end(); ++it, ++i) { Player* players = env->getPlayerByUID(*it); if (players) { lua_pushnumber(L, tableplayers); lua_pushnumber(L, env->addThing(players)); pushTable(L); tableplayers = tableplayers+1; } } return 1; } int32_t LuaScriptInterface::luaSetPlayerTv(lua_State* L) { ScriptEnviroment* env = getEnv(); Player* player_tv = env->getPlayerByUID(popNumber(L)); Creature* creature = env->getCreatureByUID(popNumber(L)); if (!creature) { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } Player* player = creature->getPlayer(); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } if (!player_tv) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } player_tv->tv.push_back(player->getID()); SpectatorVec::iterator it; SpectatorVec list = g_game.getSpectators(player->getPosition()); Player* tmpPlayer = NULL; Condition* condition = NULL; if((condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_GAMEMASTER, -1, 0, false, GAMEMASTER_INVISIBLE))) { creature->setHideName(false); player->addCondition(condition); g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_DISAPPEAR); for(it = list.begin(); it != list.end(); ++it) { if((tmpPlayer = (*it)->getPlayer()) && !tmpPlayer->canSeeCreature(player)) tmpPlayer->sendMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); } for(AutoList<Player>::iterator pit = Player::autoList.begin(); pit != Player::autoList.end(); ++pit) { if(!pit->second->canSeeCreature(player)) pit->second->notifyLogOut(player); } IOLoginData::getInstance()->updateOnlineStatus(player->getGUID(), false); if(player->isTrading()) g_game.internalCloseTrade(player); player->clearPartyInvitations(); if(player->getParty()) player->getParty()->leave(player); g_game.internalTeleport(player, player_tv->getPosition(), true); } lua_pushboolean(L, true); } int32_t LuaScriptInterface::luaDoSendChannelsTv(lua_State* L) { ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } player->sendChannelsDialog(true); lua_pushboolean(L, true); return 1; } int32_t LuaScriptInterface::luaDoRemovePlayerTv(lua_State* L) { ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); Player* creature = env->getPlayerByUID(popNumber(L)); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } for(std::list<uint32_t>::iterator it = player->tv.begin(); it != player->tv.end(); ++it) { if ((*it) == creature->getID()) { Tvlist tv = player->tv; if (!creature) { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); return 1; } Player* player_tv = creature->getPlayer(); if (!player) { return 1; } SpectatorVec::iterator its; SpectatorVec list = g_game.getSpectators(player_tv->getPosition()); Player* tmpPlayer = NULL; Condition* condition = NULL; creature->setHideName(false); if((condition = player_tv->getCondition(CONDITION_GAMEMASTER, CONDITIONID_DEFAULT, GAMEMASTER_INVISIBLE))) { IOLoginData::getInstance()->updateOnlineStatus(player_tv->getGUID(), true); for(AutoList<Player>::iterator pit = Player::autoList.begin(); pit != Player::autoList.end(); ++pit) { if(!pit->second->canSeeCreature(player_tv)) pit->second->notifyLogIn(player_tv); } for(its = list.begin(); its != list.end(); ++its) { if((tmpPlayer = (*its)->getPlayer()) && !tmpPlayer->canSeeCreature(player_tv)) tmpPlayer->sendMagicEffect(player_tv->getPosition(), MAGIC_EFFECT_TELEPORT); } player_tv->removeCondition(condition); g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_APPEAR); *it = NULL; } } } lua_pushboolean(L, true); } Continuando em luascript.cpp procure: //doCreatureSay(uid, text[, type = SPEAK_SAY[, ghost = false[, cid = 0[, pos]]]]) lua_register(m_luaState, "doCreatureSay", LuaScriptInterface::luaDoCreatureSay); Coloque embaixo: //doRemovePlayerTv(cid, id) lua_register(m_luaState, "removePlayerTv", LuaScriptInterface::luaDoRemovePlayerTv); //getAllsTv() lua_register(m_luaState, "getTvs", LuaScriptInterface::luaGetAllsTvs); //setPlayerTv(cid, player) lua_register(m_luaState, "setPlayerTv", LuaScriptInterface::luaSetPlayerTv); //doSendChannelstTv(cid) lua_register(m_luaState, "doSendChannelsTv", LuaScriptInterface::luaDoSendChannelsTv); Em luascript.h procure: static int32_t luaGetPlayerParty(lua_State* L); Coloque embaixo: static int32_t luaGetAllsTvs(lua_State* L); static int32_t luaSetPlayerTv(lua_State* L); static int32_t luaDoSendChannelsTv(lua_State* L); static int32_t luaDoRemovePlayerTv(lua_State* L); Vamos agora em game.cpp: Procure: bool Game::playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const std::string& receiver, const std::string& text) E substitua função por esta nova função: bool Game::playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const std::string& receiver, const std::string& text) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; std::string str; if (player->getStorage(34421, str) && str == "true") { if (type == SPEAK_SAY) { player->getStorage(292924, str); player->sendTextMessage(MSG_STATUS_SMALL, str.c_str()); return false; } switch(type) { case SPEAK_WHISPER: return playerWhisper(player, text); case SPEAK_YELL: return playerYell(player, text); case SPEAK_PRIVATE: case SPEAK_PRIVATE_RED: case SPEAK_RVR_ANSWER: return playerSpeakTo(player, type, receiver, text); case SPEAK_CHANNEL_O: case SPEAK_CHANNEL_Y: case SPEAK_CHANNEL_RN: case SPEAK_CHANNEL_RA: case SPEAK_CHANNEL_W: { if(playerTalkToChannel(player, type, text, channelId)) return true; return playerSay(playerId, 0, SPEAK_SAY, receiver, text); } case SPEAK_BROADCAST: return playerBroadcastMessage(player, SPEAK_BROADCAST, text); case SPEAK_RVR_CHANNEL: return playerReportRuleViolation(player, text); case SPEAK_RVR_CONTINUE: return playerContinueReport(player, text); default: break; } internalCreatureSay(player, SPEAK_SAY, text, false); return false; } uint32_t muteTime = 0; bool muted = player->isMuted(channelId, type, muteTime); if(muted) { char buffer[75]; sprintf(buffer, "You are still muted for %d seconds.", muteTime); player->sendTextMessage(MSG_STATUS_SMALL, buffer); return false; } if(player->isAccountManager()) { player->removeMessageBuffer(); return internalCreatureSay(player, SPEAK_SAY, text, false); } if(g_talkActions->onPlayerSay(player, type == SPEAK_SAY ? CHANNEL_DEFAULT : channelId, text, false)) return true; if(!muted) { ReturnValue ret = RET_NOERROR; if(!muteTime) { ret = g_spells->onPlayerSay(player, text); if(ret == RET_NOERROR || (ret == RET_NEEDEXCHANGE && !g_config.getBool(ConfigManager::BUFFER_SPELL_FAILURE))) return true; } player->removeMessageBuffer(); if(ret == RET_NEEDEXCHANGE) return true; } switch(type) { case SPEAK_SAY: return internalCreatureSay(player, SPEAK_SAY, text, false); case SPEAK_WHISPER: return playerWhisper(player, text); case SPEAK_YELL: return playerYell(player, text); case SPEAK_PRIVATE: case SPEAK_PRIVATE_RED: case SPEAK_RVR_ANSWER: return playerSpeakTo(player, type, receiver, text); case SPEAK_CHANNEL_O: case SPEAK_CHANNEL_Y: case SPEAK_CHANNEL_RN: case SPEAK_CHANNEL_RA: case SPEAK_CHANNEL_W: { if(playerTalkToChannel(player, type, text, channelId)) return true; return playerSay(playerId, 0, SPEAK_SAY, receiver, text); } case SPEAK_PRIVATE_PN: return playerSpeakToNpc(player, text); case SPEAK_BROADCAST: return playerBroadcastMessage(player, SPEAK_BROADCAST, text); case SPEAK_RVR_CHANNEL: return playerReportRuleViolation(player, text); case SPEAK_RVR_CONTINUE: return playerContinueReport(player, text); default: break; } return false; } Continuando em game.cpp procure a função: ReturnValue Game::internalMoveCreature(Creature* creature, Direction direction, uint32_t flags/* = 0*/) E substitua por esta função: ReturnValue Game::internalMoveCreature(Creature* creature, Direction direction, uint32_t flags/* = 0*/) { const Position& currentPos = creature->getPosition(); Cylinder* fromTile = creature->getTile(); Cylinder* toTile = NULL; Position destPos = getNextPosition(direction, currentPos); if(direction < SOUTHWEST && creature->getPlayer()) { Tile* tmpTile = NULL; if(currentPos.z != 8 && creature->getTile()->hasHeight(3)) //try go up { if((!(tmpTile = map->getTile(Position(currentPos.x, currentPos.y, currentPos.z - 1))) || (!tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID))) && (tmpTile = map->getTile(Position(destPos.x, destPos.y, destPos.z - 1))) && tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID)) { flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE; destPos.z--; } } else if(currentPos.z != 7 && (!(tmpTile = map->getTile(destPos)) || (!tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID))) && (tmpTile = map->getTile(Position( destPos.x, destPos.y, destPos.z + 1))) && tmpTile->hasHeight(3)) //try go down { flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE; destPos.z++; } } ReturnValue ret = RET_NOTPOSSIBLE; if((toTile = map->getTile(destPos))) ret = internalMoveCreature(NULL, creature, fromTile, toTile, flags); if(ret != RET_NOERROR) { if(Player* player = creature->getPlayer()) { player->sendCancelMessage(ret); player->sendCancelWalk(); } } Player* player = creature->getPlayer(); if (player) { Tvlist::iterator it; it = player->tv.begin(); for(uint32_t i = 1; it != player->tv.end(); ++it, ++i) { Player* players = getPlayerByID(*it); if (players) { internalTeleport(players, player->getPosition(), true, 0); } } } return ret; } Procure a função: bool Game::playerRequestChannels(uint32_t playerId) Substitua a função por: bool Game::playerRequestChannels(uint32_t playerId) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; player->sendChannelsDialog(false); return true; } Agora vamos a protocolgame.cpp e procure a função; void ProtocolGame::sendChannelsDialog(bool tv) E substitua por esta função: void ProtocolGame::sendChannelsDialog(bool tv) { NetworkMessage_ptr msg = getOutputBuffer(); std::string str; if(msg) { if (tv) { uint16_t bytes = 0; for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) { it->second->getStorage(22120, str); if (str == "true") { bytes = bytes+1; } } if (bytes < 1) { player->sendCancel("Não há nenhuma tv online"); return; } TRACK_MESSAGE(msg); msg->AddByte(0xAB); msg->AddByte(bytes); uint16_t id = 200; for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) { it->second->getStorage(22120, str); if (str == "true") { id = id+1; it->second->getStorage(12121, str); msg->AddU16(id); msg->AddString(str); } } return; } TRACK_MESSAGE(msg); msg->AddByte(0xAB); ChannelList list = g_chat.getChannelList(player); msg->AddByte(list.size()); for(ChannelList::iterator it = list.begin(); it != list.end(); ++it) { if(ChatChannel* channel = (*it)) { msg->AddU16(channel->getId()); msg->AddString(channel->getName()); } } } } Procure em protocolgame.h a seguinta declaração: void sendChannelsDialog(); Substitua por: void sendChannelsDialog(bool tv); Agora vamos em player.h e procure: void sendChannelsDialog() {if(client) client->sendChannelsDialog();} E substitua por: void sendChannelsDialog(bool tv) {if(client) client->sendChannelsDialog(tv);} Procure denovo em player.h: typedef std::list<Party*> PartyList; E adicione embaixo: typedef std::list<uint32_t> Tvlist; Continuando em player.h procure: AttackedSet attackedSet; Coloque embaixo: Tvlist tv; Vamos denovo a protocolgame.cpp e procure: if(player->isAccountManager()) { switch(recvbyte) { case 0x14: parseLogout(msg); break; case 0x96: parseSay(msg); break; default: sendCancelWalk(); break; } } Coloque embaixo: std::string str; if (player->getStorage(34421, str) && str == "true") { player->getStorage(292924, str); switch(recvbyte) { case 0x14: parseLogout(msg); break; case 0x96: parseSay(msg); break; case 0x97: // request channels parseGetChannels(msg); break; case 0x98: // open channel parseOpenChannel(msg); break; case 0x99: // close channel parseCloseChannel(msg); break; case 0x9A: // open priv parseOpenPriv(msg); break; case 0x1E: // keep alive / ping response parseReceivePing(msg); break; default: player->sendTextMessage(MSG_INFO_DESCR, str); break; } Seguidamente vá em creatureevent.cpp e procure: else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; Coloque embaixo: else if(tmpStr == "selecttv") m_type = CREATURE_EVENT_SELECTTV; Procure depois: case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; Coloque embaixo: case CREATURE_EVENT_SELECTTV: return "onSelectTv"; Procure: case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; Coloque embaixo: case CREATURE_EVENT_SELECTTV: return "cid, id"; Procure: uint32_t CreatureEvent::executeChannelJoin(Player* player, uint16_t channelId, UsersMap usersMap) { //onJoinChannel(cid, channel, users) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local channel = " << channelId << std::endl; scriptstream << "local users = {}" << std::endl; for(UsersMap::iterator it = usersMap.begin(); it != usersMap.end(); ++it) scriptstream << "users:insert(" << env->addThing(it->second) << ")" << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushnumber(L, channelId); UsersMap::iterator it = usersMap.begin(); lua_newtable(L); for(int32_t i = 1; it != usersMap.end(); ++it, ++i) { lua_pushnumber(L, i); lua_pushnumber(L, env->addThing(it->second)); lua_settable(L, -3); } bool result = m_interface->callFunction(3); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeChannelJoin] Call stack overflow." << std::endl; return 0; } } Coloque embaixo: uint32_t CreatureEvent::executeSelectTv(Player* player, uint16_t id) { //onSelectTv(cid, id) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local id = " << id << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushnumber(L, id); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeChannelJoin] Call stack overflow." << std::endl; return 0; } } Vá em creatureevent.h e procure: CREATURE_EVENT_ATTACK, Coloque embaixo: CREATURE_EVENT_SELECTTV Procure continuando em creatureevent.h: uint32_t executeCombat(Creature* creature, Creature* target); Coloque embaixo: uint32_t executeSelectTv(Player* player, uint16_t id); Vá agora em game.cpp denovo e procure a função: bool Game::playerOpenChannel(uint32_t playerId, uint16_t channelId) Substitua a função por: bool Game::playerOpenChannel(uint32_t playerId, uint16_t channelId) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; if (channelId >= 200) { CreatureEventList tvEvents = player->getCreatureEvents(CREATURE_EVENT_SELECTTV); for(CreatureEventList::iterator it = tvEvents.begin(); it != tvEvents.end(); ++it) (*it)->executeSelectTv(player, channelId); return true; } ChatChannel* channel = g_chat.addUserToChannel(player, channelId); if(!channel) { #ifdef __DEBUG_CHAT__ std::cout << "Game::playerOpenChannel - failed adding user to channel." << std::endl; #endif return false; } if(channel->getId() != CHANNEL_RVR) player->sendChannel(channel->getId(), channel->getName()); else player->sendRuleViolationsChannel(channel->getId()); return true; } Vá em data/lib e crie um novo arquivo lua chamado tv system: names = {} storage_hastv = 22120 storage_watchtv = 34421 storage_nametv = 12121 storage_idwatchtv = 21213 storage_msgwatch = 292924 storage_namewatchtv = 21923 storage_save_group_id = 63732 smallerros = false ERROR_ID_NOT_FOUND = "ERROR\nPLAYER NOT FOUND\nSet Storage FALSE ON LOGIN" MSG_TV_SYSTEM = "Esta ação não e possivel você esta assistindo" MSG_CREATE_TV = "Parabéns, você criou sua TV " MSG_LOGOUT_TV = "Você saiu da tv " MSG_LOGOUT_TV_TOWN = "Você retornou a sua cidade " ID_ITEM_TV = 1949 ---- IMPORTANTE ID DA SUA CAM(CAMERA) MSG_WATCH_TV = "Você esta assitindo a uma tv" MSG_HAS_TV = "Você ja tem tv" MSG_NO_HAS_TV = "Você não tem tv" MSG_ENTER_PLAYER = "Um novo player entrou - " MININUM_STRING_CARACTER = 4 HAS_TV = "Você ja tem uma tv" MSG_DELETE_TV = "Você deletou sua channel com sucesso" MSG_WATCH_TV_ENTER_TV = "Você entrou na channel " NAME_WRONG = "Nome incorreto" MSG_HAS_NAME_TV = "Desculpe, ja existe uma tv com este nome escolha outro por favor" function setBooleanStorage(cid, storage, bool) if not bool then setPlayerStorageValue(cid, storage, -1) return true end setPlayerStorageValue(cid, storage, "true") return true end function checkFindStrings(str, array) for i=1, #array do if string.find(str, array[i]) then return true end end return false end function playerHasTv(cid) return getPlayerStorageValue(cid, storage_hastv) == "true" and true end function playerWatchTv(cid) return getPlayerStorageValue(cid, storage_watchtv) == "true" and true end function getTvOnlines() local t = {} local online = getPlayersOnline() for i=1, #online do if playerHasTv(online[i]) then table.insert(t, online[i]) end end return t end function getNamesTv(sep) local tvs = getTvOnlines() str = "" for i=1, #tvs do str = str..sep..getTvName(tvs[i]) end return str end function getIdByTvName(name) local tvs = getTvOnlines() for i=1, #tvs do if tvs[i] == name then return name end end return false end function stopWatchAllsPlayerTv(id) local onlines = getTvs(id) for i=1, #onlines do playerStopWatchTv(onlines[i]) end return true end function getNameTv(id) if not isPlayer(id) then print(ERROR_ID_NOT_FOUND) return false end local storage = getPlayerStorageValue(id, storage_nametv) if storage ~= -1 then return storage end return "" end function createNewTv(cid, name) if #name < MININUM_STRING_CARACTER or checkFindStrings(name, names) then doPlayerSendCancel(cid, NAME_WRONG) return false end local tvs = getTvOnlines() for i=1, #tvs do if getNameTv(tvs[i]) == name then doPlayerSendCancel(cid, MSG_HAS_NAME_TV) return false end end if playerHasTv(cid) then doPlayerSendCancel(cid, MSG_HAS_TV) return false end if playerWatchTv(cid) then doPlayerSendCancel(cid, MSG_WATCH_TV) return false end setBooleanStorage(cid, storage_hastv, true) setPlayerStorageValue(cid, storage_nametv, name) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_CREATE_TV..name) return true end function getTvNameById(id) if not isPlayer(id) then print(ERROR_ID_NOT_FOUND) return false end return getPlayerStorageValue(id, storage_nametv) end function playerWatchTv(cid, id) if not isPlayer(id) then if smallerros then print(ERROR_ID_NOT_FOUND) end return false end if playerHasTv(cid) then doPlayerSendCancel(cid, MSG_HAS_TV) return false end if playerWatchTv(cid) then doPlayerSendCancel(cid, MSG_WATCH_TV) return false end local name = getTvNameById(id) setBooleanStorage(cid, storage_watchtv, true) setPlayerStorageValue(cid, storage_msgwatch, MSG_TV_SYSTEM) setPlayerStorageValue(cid, storage_idwatchtv, id) setPlayerStorageValue(cid, storage_namewatchtv, name) setPlayerStorageValue(cid, storage_save_group_id, getPlayerGroupId(cid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_WATCH_TV_ENTER_TV) doPlayerSendTextMessage(id, MESSAGE_STATUS_CONSOLE_BLUE, MSG_ENTER_PLAYER..getCreatureName(cid)) setPlayerTv(cid, id) return true end function playerStopWatchTv(cid) local id = getPlayerStorageValue(cid, storage_idwatchtv) local name = getPlayerStorageValue(cid, storage_namewatchtv) local town = getPlayerTown(cid) local namet = getTownName(town) local post = getTownTemplePosition(town) if getPlayerStorageValue(cid, storage_watchtv) ~= "true" then return true end removePlayerTv(cid, id) setBooleanStorage(cid, storage_watchtv, false) setPlayerStorageValue(cid, storage_idwatchtv, -1) setPlayerStorageValue(cid, storage_namewatchtv, -1) setPlayerGroupId(cid, getPlayerStorageValue(cid, storage_save_group_id)) doTeleportThing(cid, post) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_LOGOUT_TV..name) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_LOGOUT_TV_TOWN..namet) return true end function deleteTv(cid) if getPlayerStorageValue(cid, 22120) ~= "true" then return false end stopWatchAllsPlayerTv(cid) setBooleanStorage(cid, storage_hastv) setPlayerStorageValue(cid, storage_nametv, -1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_DELETE_TV) return true end Agora vamos em actions e crie um arquivo lua chamado tv e coloque: function onUse(cid, item, fromPosition, itemEx, toPosition) doSendChannelsTv(cid) end Vá em actions.xml e coloque a seguinte configurando com o id da sua tv: Agora vamos em talkactions e crie um novo arquivo lua chamado delete e coloque isto: function onSay(cid, words, param, channel) deleteTv(cid) return true end Agora vamos em talkactions.xml e coloque a seguinte tag: <talkaction words="/delete" event="script" value="delete.lua"/> Agora vamos a creaturescripts e crie um arquivo lua chamado createTv e coloque: function onTextEdit(cid, it:em, newText) if item.itemid == ID_ITEM_TV then createNewTv(cid, newText) return true end return true end Crie outro chamado de tv e coloque: function onSelectTv(cid, id) local tv = getTvOnlines() local idstarter = 200 for i=1, #tv do local tv = tv[i] local sub_id = i+idstarter if sub_id == id then playerWatchTv(cid, tv) end end return true end Crie outro chamado de tvlogout : function onLogout(cid) if isPlayer(cid) then deleteTv(cid) playerStopWatchTv(cid) end return true end Vá em creaturescripts.xml e coloque as seguintes as tags: <event type="textedit" name="newTv" event="script" value="createTv.lua"/> <event type="selecttv" name="selecttv" event="script" value="tv.lua"/> <event type="logout" name="tvlogout" event="script" value="tvlogout.lua"/> Vá em data/xml/group.xml e abra o arquivo e coloque o novo group: <group id="8" name="Tv" flags="3845069447162" customFlags="2097151" access="1" violationReasons="4" nameViolationFlags="2"/> Video do sistema em execução: E recomendavel NUNCA modificar as storages porques estão ligados aos codigos. Para mudar o id da camera e so mudar a variavel ID_ITEM_TV Para deletar uma tv diga o comand /delete
    2 pontos
  6. Opa galera do XTibia, eu mais uma vez trazendo um bom e útil tutorial. Esse tutorial é pra quem tem a necessidade de uma pagina que confirme uma doação feita e automaticamente essa confirmação seja direcionada ao e-mail do administrador! Bom galera é um php simples, não tenho muito conhecimento com php, o que estou postando agora foi o resultado de algumas pesquisas e pouquinho de dor de cabeça mais saiu do jeito que eu queria. OBS: A imagem anexada chega no seu e-mail como um arquivo sem formato mais pode abrir com o Paint ou o Visualizador de imagem que abre normal! Lembrando que é obrigatório e necessário que toda parte de apache, php e send-mail estejam funcionando corretamente no seu servidor, como eu utilizo Linux apenas instalei apache2, php5 e sendmail. Comandos que eu utilizei no Linux: apt-get install apache2 apt-get install php5 apt-get install sendmail killall -9 apache2 /etc/init.d/apache2 start Outra coisa, dificilmente esse sistema funcione no seu computador, localhost, é necessário um configuração adequada, eu utilizo um servidor dedicado não tive dor de cabeça em relação a isso. Vamos ao que interessa... Crie dois arquivos .php chamados, confirmar.php e enviar.php, adicione os dois na pasta htdocs ou quem usa linux pasta www, quem utiliza o Novo Gesior ACC joga o confirmar.php na pasta pages e o enviar.php na pagina htdocs ou www. Dentro do arquivo confirmar.php você adiciona os seguintes code: CONFIRMAR.PHP SEM ANEXO: CONFIRMAR.PHP COM ANEXO: Dentro do arquivo enviar.php você adiciona os seguintes code: ENVIAR.PHP SEM ANEXO: ENVIAR.PHP COM ANEXO: O que deve ser alterado: Enviar.php Linhas, 3 e 60 03. $email_to = "natanbeckman@live.com"; // Seu e-mail 60. echo "<script> window.location.href = 'http://localhost'; </script>" ; // Site do seu server Confirmar.php Caso você utilize a opção Login: então altere na linha. 3 03. <label for="character">Character Name:</label> Em index.php adicione: case "confirmar"; $subtopic = "confirmar"; $topic = "Confirmar"; include("confirmar.php"); break; Em layout.php adicione abaixo de: <a href='?subtopic=shopsystem&action=show_history'> <div id='submenu_show_history' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)'onMouseOut='MouseOutSubmenuItem(this)'> <div class='LeftChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div> <div id='ActiveSubmenuItemIcon_show_history' class='ActiveSubmenuItemIcon'style='background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);'></div> <div class='SubmenuitemLabel'>History</div> <div class='RightChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div> </div> </a> Adicione: <a href='?subtopic=confirmar'> <div id='submenu_confirmar' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)'onMouseOut='MouseOutSubmenuItem(this)'> <div class='LeftChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div> <div id='ActiveSubmenuItemIcon_confirmar' class='ActiveSubmenuItemIcon' style='background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);'></div> <div class='SubmenuitemLabel'>Confirmar</div> <div class='RightChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div> </div> </a> Dessa forma somente que tiver com ACC logada vai ter acesso a pagina. E pronto galera terminamos, espero que todos façam atentamente pra sair tudo perfeito, espero ter ajudado. Qualquer pessoa pode fazer copia deste tutorial desde que mencione os devidos créditos. Vejam algumas imagens como ficou o meu: SEM ANEXO: COM ANEXO: COMO CHEGA NO E-MAIL: Creditos: Natanael Beckman
    2 pontos
  7. (Como fui ganhador do ultimo torneio, estou seguindo com ele) Segue abaixo como deverá ser o funcionamento deste evento. conto com a participação de todos. Premiação: 1° Lugar- 5 Reps + Medalha especial. 2° Lugar- 2 Reps. 3° Lugar - 1 Rep. Durante toda a semana este tópico estará aberto com uma proposta de temática particular para um desafio aberto à todos os usuários que se interessarem. A leitura das regras é crucial para um bom funcionamento do concurso. Para quem já participou, já tem conhecimento das regras, espero que não haja desclassificações. Espero que todos tenham entendido o funcionamento do evento e aguardo uma participação em massa, estou contando com vocês, segue abaixo o tema: Boa sorte. OBS: Sei que o tópico está igualzinho, mas o que importa é o conteúdo, eu espero que todos participem. Quem irá premiar o vencedor é o Lucasmml, eu estou apenas seguindo com a proposta, de continuar o evento. Espero que os próximos vencedores também continuem com a proposta. @IMPORTANTE - VOCÊS TEM 7 DIAS PARA POSTAR AS SPRITES, ATÉ O DIA 26/03 (QUARTA-FEIRA). SERÁ CRIADO UM TÓPICO PARA VOTAÇÃO.
    2 pontos
  8. Tonynh

    [Life Thread] Lock Sano

    Resolvi criar um novo char só para fazer um LT de sua jornada.. =) Ele está no mesmo mundo do meu EK, então o chamarei de "maker", levando em consideração que não é o meu char mais forte, e está em outra account. Estarei jogando de uma maneira mais "old-school", sem muito rush-level, e sim role-play.. focando nos detalhes do game. Nome: Lock Sano Vocation: Knight Level: 8 World: Honera Status: Free Account SET ATUAL SKILL's ATUAIS IMAGENS O TÓPICO SERÁ ATUALIZADO COM AS PRÓXIMAS POSTAGENS. FIQUE A VONTADE PARA ACOMPANHAR.
    2 pontos
  9. Alexclusive

    Comidas gigantes [fantástico]

    O hábito infantil de brincar com a comida ganha uma nova dimensão... Vejam só que fotos fodas: "Pegando no pesado para encher as uvas" "Atenção: homens trabalhando" "Manobras radicais no abacate" "Flagrado no ar" "Trabalhadores no horário do almoço em pleno Empire State?" "Esta mais uma pra uma marmita mesmo...rs" "O artista em seu ofício" "O mármore (ou amendoim) esculpido vira obra de arte" "Não deve ser nada fácil trabalhar neste solo cheio de água. Ops, é uma melancia kkkkkkk" "Um dia de brincadeiras na neve" "Ou um delicioso doce com claras em neve?" "Fogo, fogo!" "Não é todo mundo que aguenta o calor da pimenta dedo-de-moça" "Muitas bolas para um buraco só!" "Ainda bem que cada jogador tem o seu" Bem criativas né? Pra mim todas ficaram ótimas... Espero que também tenham gostado, Divirtam-se vendo as imagens
    2 pontos
  10. Alexclusive

    Assinaturas da Semana

    Dando aquela organizada de sempre no pc aqui, achei uma pasta que eu não via a muito tempo. Uma pasta que tinham algumas de minhas signs que fiz quando comecei a participar do concurso Assinatura da Semana, que hoje é o A Melhor Assinatura. (PARTICIPE VOCÊ TAMBÉM) (não estão em ordem de participação) Tenho certeza que teve outras...só que não estavam aqui e eu provavelmente devo ter deletado. De todas que participei só fiquei em primeiro 1x. Podem cair matando ai...kkkkkkkkkk
    2 pontos
  11. wesquel

    Duvida Sobre dat editor

    Ola eu vim saber pq quando eu vou compilar o dat no meu dat editor some tudo olhem eu faço tudo direito 1# Eu pego a sprite do pokemon,o corpo e a Foto 2#Vou Compila seleciono tudo dnv o dat e o spr 3# quando eu salvei aconteceu isso Obs: Uso o Servidor gabrielstux Editado pela sara
    2 pontos
  12. Zoobu

    Galeria [Keviz]

    Valew, vou continuar sim. Valeu Breno :} vlw kkkkk ué, vc sumiu cara :3
    2 pontos
  13. eu tinha feito aki no serv q eu tinha começado do zero, mas parece q quando formatei o pc eu acabei salvando uma versao antiga das sources e dai n tenhu mais essa ediçao aki... mas se n me engano eu fiz assim... realmente n eh preciso checar se tem player por perto pra mandar os eventos quando o serv ta iniciando... entao o melhor jeito de fazer essa ediçao eh esse ae, pelo menos pra mim, executando soh o evento no proprio monstro... com isso, vai disparar o onSpawn... -em tese, n lembro se foi assim q fiz antes...-
    2 pontos
  14. Creditos: Vodkart Kydrai fala galerinha resolvi posta alguns script que acontece quando o player mata algum monstro ... o primeiro é o script que acontece quando voce mata um Monstro abre o teleport. o segundo é matar o monstro e sumir a parede por algum tempo. Obs: o Nome do monstro deve ser colocado com Letra Maiuscula. [ Matar monstro e abrir Teleport ] creaturescript\script [ Matar Monstro e parede sumir por determinado tempo ] creaturescript\script [ Matar Monstro e ser teleportado ] [ Matar Monstro e Ganhar Storage ]
    1 ponto
  15. PedroXtibiaaaa

    [8.6] Eternal Kingdoms Map

    Download: Clique aqui Scan: Clique aqui Remere's Map Editor 2.1 Créditos: Artii e o pessoal do Eternal Kingdoms (otland) Versão: 8.60/8.61, testei com 8.70 e funcionou também... O mapa possui o mínimo de bugs possíveis, talvez alguns pequenos bugs simples, todas as houses estão 100%. Cidades: Aleda Leafport Fallen Selroth Seldia Shadow Wood Screenshots
    1 ponto
  16. Vodkart

    Simple Task 3.0

    Mods: NPC Como configurar?
    1 ponto
  17. O script de hoje eu não fiz sozinho. Fomos eu e o @zipter98 que fizemos e o @dalvorsn nos ajudou a solucioar um problema bem chato. Para ver os outros script de terça, clique aqui. Oq o script faz? A cada monstro que vc mata, os itens que vc está usando ganham 1 de exp. Quando seus itens alcançam números determinados de exp, eles upam ficam com o nome Demon Helmet + 1, etc e também são melhorados. Elmos, armaduras, calças e botas ganham 1 de arm por level, escudos, 1 de def e armas 1 de ataque. Crie itens upgrade.lua em data/creaturescripts/scripts e coloque: Em data/creaturescripts/creturescripts.xml, coloque essas duas TAGs: <event type="kill" name="Item level" event="script" value="itens upgrade.lua"/><event type="login" name="Item levell" event="script" value="itens upgrade.lua"/> Para configurar a seu gosto, basta alterar as tabelas conforme explicado nos comentários dentro do código. Abraços.
    1 ponto
  18. Centox

    TFS 0.4 (Revisado by Chaitosoft)

    Ola, Venho aqui disponibilizar o TFS 0.4_DEV mais cobiçado da ChaitoSoft com todas as features. Mirror¹: sources.rar Mirror²: http://www.sendspace.com/file/ceeetr Quem curtiu deixa 1 ReP+ como forma de agradecimento e assim me incentivando a postar mais e mais conteudos exclusivos. Scan (limpo)
    1 ponto
  19. lazarocp

    Novidade: Poketibia 9.60

    Servidor Poketibia 9.60 (Por Lazarocp) - Aprovado para download - - Servidor em desenvolvimento - Você também pode ajudar! • O servidor ainda não se encontra 100%, possui erros simples nas sources. • Os Scripts ainda estão desorganizados (peço desculpas). ○ Este servidor está na versão 9.60, sendo assim, tive que mexer nos scripts para deixá-lo funcional. Informações gerais: • Catch/Goback: 90%. (Havendo apenas um erro no data/creaturescripts/scripts/goback.lua). Ride: 100% Fly: 95% Surf: 99% Blink: 100% Rock Smash: 100% Demais: 100%. Clan system: 100%. M1 à M12: 100%. Portrait System: 100%. Nurse Joy: 100%. Nota: O nosso mapa está sendo feito do zero (0). Já contamos com seis (06) cidades e vários respawns. Pokémons: Primeira geração: 100% Segunda geração: 100% Terceira geração: 100% Quarta geração: 100% -- Evolução por stones: 100% Race e Combat: 100% Pokedex: 95% (Pokedex com descrição do pokémon e onde encontrá-lo. A função "onde encontrá-los", só está disponível em alguns Pokemons). Sistema de Pokémons iniciais: 100% • Novas Pokébolas! • Mega Stones: Retiradas. Downloads: Removidos , Servidor desatualizado e ultrapassado XD Créditos: Criação e postagem: Lazarocp • Ao divulgar ou utilizar, favor mantenham os devidos créditos. • REP'S serão sempre bem vindos, obrigado. Tópico editado e organizado por Avilack.
    1 ponto
  20. Death System Introdução: Vamos pessoal participar da oms, esse sistema faz com que quando um player mate o outro apareça um ceifeiro vindo pega a alma dele. Vamos la começar a add a script Em creaturescript/script, crie DeathSystem.lua -- Do not remove the credits -- -- [CREATURESCRIPT] Death System -- -- developed by Rigby to help DuuhCarvalho -- -- Especially for the Xtibia.com -- function onDeath(cid, corpse, killer) local pos = getCreaturePosition(cid) local monster = 'ceifeiro' local timer = 3 -- quanto tempo vai demorar pra sumir function removeMonster() for _, pid in ipairs(getCreatureSummons(killer[1])) do doRemoveCreature(pid) end return true end if isPlayer(cid) and isPlayer(killer[1]) then doConvinceCreature(killer[1], doCreateMonster(monster, pos)) doSendAnimatedText(getThingPos(cid), "DEATH!", 125) doSendMagicEffect(getThingPos(cid), 65) addEvent(removeMonster, timer*1000) end return true end Creaturescript.xml tag <event type="death" name="DeathSystem" event="script" value="DeathSystem.lua"/> Login.lua antes do ultimo return true registerCreatureEvent(cid, "DeathSystem") Agora vamos criar o ceifeiro em monster crie um ceifeiro.xml <?xml version="1.0" encoding="UTF-8"?> <monster name="Ceifeiro" nameDescription="a ceifeiro" race="blood" experience="0" speed="0" manacost="220"> <health now="9999999999999" max="9999999999999"/> <look type="300" corpse="5971"/> <targetchange interval="2000" chance="0"/> <strategy attack="100" defense="0"/> <flags> <flag skull="5"/> <flag summonable="1"/> <flag attackable="1"/> <flag hostile="0"/> <flag illusionable="1"/> <flag convinceable="1"/> <flag pushable="1"/> <flag canpushitems="0"/> <flag canpushcreatures="0"/> <flag targetdistance="1"/> <flag staticattack="90"/> <flag runonhealth="8"/> </flags> <defenses armor="1" defense="2"/> <immunities> <immunity physical="0"/> <immunity energy="0"/> <immunity fire="0"/> <immunity poison="0"/> <immunity lifedrain="0"/> <immunity paralyze="0"/> <immunity outfit="0"/> <immunity drunk="0"/> <immunity invisible="0"/> </immunities> <voices interval="2000" chance="100"> <voice sentence="HAHAHAHA"/> </voices> </monster> em monsters.xml adicione essa tag antes do ultimo </monsters> <monster name="Ceifeiro" file="ceifeiro.xml"/> Espero que gostem.
    1 ponto
  21. Poxa, lembro que antigamente existia servidor NPvP aos montes, hoje em dia está infestado dessas porcarias de servidores derivados, o que será que causou essa queda de popularidade dos servidores NPvP?
    1 ponto
  22. IvanAppel

    Script de Dimensão

    Fiz um script de dimensão, onde o player cria um portal que o leva à uma dimensão, e depois volta para o local onde estava. Crie um arquivo nas pasta actions/script com o nome de dimensao.lua e cole isto: Em actions.xml adicione a seguinte tag: Em spells.xml adicione a tag: Em spells/instant crie um arquivo com nome ryokoo bansho tenki.lua e cole isto: Dentro da dimensão coloque com o map editor o teleport do mesmo ID que faz quando usa a magia.. Qualquer dúvida só falar ><
    1 ponto
  23. u n d e r

    Tibia, otserv e equipe!

    Cansados de mudanças? Esperamos que não! Dia após dia a equipe têm trabalhado com afinco para melhorar nossa comunidade. Vamos as mudanças dos últimos dias: Equipe​Rodrigo recebeu a capa de Diretor. A trajetória deste rapaz inicia-se junto com a minha. Vivenciamos o Xtibia nascer de uma canal no Irc, um portal em Phpnuke e um sistema de Fórum gratuito foram os primeiros passos desta comunidade. Em sua jornada pelo Xtibia chegou a hierarquia máxima de Sub-administração/Direção, gerenciando principalmente as relações com os usuários, defensor nato do Barzinho do Ekz junto ao nosso herói JV Chequer. Desejamos não só votos de sucesso, mas que agregue muito valor a esta comunidade e nos sentimos honrados em aceitar o convite. Bem-vindo de volta! -- vital900 recebeu a capa de Supervisor. Se bem conheço nosso amigo vital, eita rapaz que gosta de um pedestal, não é mesmo? Com suas propostas para revitalização da nossa área de Tibia, bem como jogador nato e extremamente viciado, uma importante missão foi dada ao nosso ex-moderador. Com anos de experiência em nosso fórum, sentimos tranquilidade em dizer que ele desempenhará um bom trabalho nesta nova seção. Parabéns Vital! -- caotic recebeu a capa de Assistente. Extremamente dedicado. Caotic já fez parte de nossa equipe a algum tempo atrás, suas experiências com moderação provam que merecidamente receba sua nova capa. Desejamos que continue firme nesta jornada e que a cada dia não só compartilhe seu conhecimento, como também tenha a oportunidade de aprender. Parabéns Caotic! -- Jacques Tony recebeu a capa de Assistente. E quem é que disse que a área de design está parada? Recentemente chegamos ao nosso A Melhor Assinatura (AMA) de número 100. Responsabilidade total de nosso antes estagiário Jacques, que em dois meses tem mostrado competência em suas atividades no fórum. Continue conosco e que você possa influenciar novas pessoas a seguirem este caminho. Parabéns Tony! -- JPedroTibianno recebeu a capa de Estagiário Indicação fervorosa do nosso novo supervisor, também jogador de Tibia Global, JPedroTibianno promete alcançar níveis altos em seu mundo e trazer o melhor conteúdo para a seção do Xtibia. Bem-vindo a equipe e desejamos a você sucesso na sua jornada in-game. -- Junior Silva recebeu a capa de Estagiário Este é o novo pupilo do nosso moderador VictorWEBMaster. Junior nos ajudará na área de websites, compartilhando e aprendendo um pouco mais no mundo da programação para web. Bem-vindo a equipe e que você cresça pessoalmente e profissionalmente dentro da família Xtibia! -- BrenoNeto recebeu a capa de Estagiário Representando a capa de Desenvolvedor de forma extraordinária e competente, nosso responsável pela seção Lucasmml o indicou para seguir com um estágio em nossa equipe. Recebemos de portas abertas esta indicação e acreditamos no potencial de Breno! Agradecemos o que tem feito até aqui e que você possa nos surpreender na área de Spriting. Bem-vindo! -- eryrrel recebeu a capa de Estagiário Erryrel estará responsável pela área de client, recentemente já fez algumas movimentações bacanas pela seção. Um de seus desafios é aprender .lua. Seja bem-vindo ao time e tenha todo o apoio necessário para que você possa crescer dentro de nossa comunidade. Vamos em frente eryrrel! ​EstruturaNovo supervisor na área de Tibia, pede uma revitalização da seção, concordam? Com um bate-bola, jogo rápido, restauramos parte do conteúdo que fora descartado em administrações anteriores e claro, reorganizado de acordo com as regras da seção. Tudo passou pela determinação e aprovação da nossa Supervisão e Direção que estarão trabalhando arduamente para levantarmos o astral e participação do jogo que originou nossos projetos open-sources. Preview: Além disso, optamos também por trazer a categoria de Roleplay um pouco mais acima das outras seções com o objetivo de melhorar o reconhecimento e também a visualização da área por parte de jogadores de otserv e tibia. A seção se encaixou perfeitamente entre ambos, veja no preview abaixo! Preview: ​GooglePlusCriamos nossa página também no GooglePlus, compartilhamos ideias, dicas, tópicos ou qualquer informação que interesse programadores e jogadores do Open Tibia e também Tibia Global. Acessem: https://plus.google.com/+XtibiaBr/ Por hoje é só pessoal, deixe sua opinião a respeito de nossas alterações! Seu feedback é muito importante para nós.
    1 ponto
  24. Shoguns

    Script de Dimensão

    Poste sua dúvida aki mesmo no fórum, que eu ou outras pessoas vai lhe ajuda Agora vou durmir, então so amanhan agora.... Obs: fica a dica pro dono do tópico que o seu script não esta funcional !
    1 ponto
  25. Shoguns

    Tibia, otserv e equipe!

    so corrigindo mais uma coisinha, é vital900, não vital90
    1 ponto
  26. mkbrabsolute

    Compilar em CentOS e VPS

    Meu caro, você tem que se importar com, Processador, Ram e UPLINK Memória RAM será mais para rodar seu mapa, dependendo do tamanho, quanto maior a memória com mais eficaz e rapidez sua distro rodará ele. Processador é o mais importante, você terá de manter o uso da CPU entre 1 até 30%, caso atinga os 99% irá crashar o servidor ou até mesmo perder a conexão com o mysql. Uplink é a conexão onde quanto maior melhor a jogabilidade, o ping e melhor para ataques, é difícil qualquer banda tomar mais que seu uplink. Espero ter ajudado.
    1 ponto
  27. JonatasLucasf

    Compilar em CentOS e VPS

    Precisa dos dois' e esses vps ai de baixo dependendo do peso do seu mapa guenta 500 player+
    1 ponto
  28. Slicer

    Usando Opcode

    eu tb nunca usei isso ae mas acredito q se seja algu +/- assim...
    1 ponto
  29. function onCastSpell(cid, var) local playerpos = getPlayerPosition(cid) local MaximoSummon = 1 if(table.maxn(summons) < MaximoSummon) then return doPlayerSendCancel (cid, "You can't control more monsters.") end local clone = doCreateMonster("bear", playerpos) doConvinceCreature(cid, clone) return TRUE end
    1 ponto
  30. wesleyt10

    Galeria Wesleyt10 (Volti)

    oi pessoínhas , tava brincando aki no meu paint e saiu umas sprites ae espero que gostem ^^ podem criticar a vontade n é nada serio só pra passa o tempo msm !!! Seria um personagem Do CDZ só a armadura neah (Aries)
    1 ponto
  31. IvanAppel

    Otclient erro, e bug no servidor

    Sobre a bag tenta isso, abre OTclient\modules\game_menuTop Ae abre o arquivo mod_topMenu Procura por: local player = g_game.getLocalPlayer() g_game.useInventoryItem(player:getInventoryItem(10):getId()) end Muda de 10 para 3
    1 ponto
  32. Vai no Config.lua e procure isso: gainExperienceColor = 215 - E so achar a Cor pelo Numero e so ir mudando eu nao lembro que numero que é!
    1 ponto
  33. http://www.xtibia.com/forum/topic/184846-video-aula-como-criar-seu-client-proprio/ lê isso ai
    1 ponto
  34. Cara, existe alguns tutoriais para isso, bastava voce procurar um pouco mais, porem, aqui estão eles: Criando Um Cliente 100% Proprio Criando seu proprio client 8.54 Video Aula de Como criar seu proprio cliente bastava voce procurar um pouco mais cara, mais é isso ai, vlw
    1 ponto
  35. Shoguns

    [AJUDA] Erro MoveEvents

    local corde = {x = 123, y = 123, z = 7} function onStepIn(cid, item, position, fromPosition) if getPlayerLevel(cid) == 210000 then doTeleportThing(cid, corde) doSendMagicEffect(fromPosition, CONST_ME_POFF) else doPlayerSendTextMessage(cid, 22, "voce nao e nivel maior que 210000 e nao pode entrar") end return true end so mudar as cordenadas em {x = 123, y = 123, z = 7}
    1 ponto
  36. caotic

    TV System by caotic

    Caramba esqueci dessa parte Vai ne player.h e procura: AttackedSet attackedSet; Coloca embaixo: Tvlist tv;
    1 ponto
  37. Concurso de Web, sem code, vira concurso de Design.. A propósito, gostei do layout Avuenja!
    1 ponto
  38. DarkIntensy

    Primeiro Templo

    Como o titulo diz esse é meu primeiro templo, e post também.Comentem e por favor opinem. EDIT:Eu errei na verdade e o depot e nao temple
    1 ponto
  39. 1 ponto
  40. Madarada

    {Tutorial Básico Sobre .Lua}

    Ta meio que um trem sem freio esse tutorial já chega explicando if,else,elseif...Tem que prestar atenção que um cara leigo não sabe nem o que é sintaxe,parâmetros e coisa e tal,tu devia te editado desde o começo.
    1 ponto
  41. Tonynh

    [Life Thread] Lock Sano

    Fique a vontade a opinar, eu estou tendo uma ideia legal para esse LT. Depois eu repasso ela para vocês =p Saindo da Isle of Destiny com 30/30 Skills atualizados.
    1 ponto
  42. masdead

    erro remeres

    Use o dat e spr do site do remeres http://remeresmapeditor.com/marklar.php?clients
    1 ponto
  43. Alexclusive

    Minhas fotografias [iPhone]

    "Admiro" bastante quase todo por de sol:
    1 ponto
  44. ve seu arquivo catch.lua e procura por issu if getPlayerStorageValue(cid, 98796) >= 1 and getPlayerItemCount(cid, 12617) <= 0 then --alterado v1.9 setPlayerStorageValue(cid, 98796, -1) setPlayerStorageValue(cid, 98797, -1) doTeleportThing(cid, SafariOut, false) doSendMagicEffect(getThingPos(cid), 21) doPlayerSendTextMessage(cid, 27, "You spend all your saffari balls, good luck in the next time...") end se issu "and getPlayerItemCount(cid, 12617) <= 0 then" nao estiver assim mude
    1 ponto
  45. u n d e r

    Estrutura modificada

    Boa tarde Xtibianos, qual a boa para este final de semana? Nossa equipe está tão motivada, que não para. A cada segundo, estamos nos movimentando buscando melhorar esta comunidade que voltou a crescer. Antes de "startar" as notícias, gostaria de agradecer a cada um que dia após dia tem elogiado e também criticado de forma construtiva as nuances de nosso fórum. 1º Aprovação de downloads Uma crítica esta semana nos chamou a atenção, para ler na íntegra, acesso o link abaixo: http://www.xtibia.com/forum/topic/229440-sugestao-aprovacao-de-downloads/ Para solucionarmos a situação, estaremos analisando membros de bom desempenho, que entenda e com uma boa conduta dentro de nosso fórum para estagiar nas seções de aprovações. Queremos de uma vez por todas, evitar que tópicos se acumulem nesta área, agilizando o processo e garantindo que todo o conteúdo seja liberado, atentando-se para a qualidade e segurança dos downloads disponibilizados. Obviamente estamos expostos a diversas situações, portanto, é muito importante também a colaboração de vocês para conseguirmos rastrear qualquer conteúdo nocivo ao usuário ou visitante do fórum. 2º Área de atendimento http://www.xtibia.com/forum/topic/229602-area-de-atendimento/ Com o objetivo de evitar qualquer "desvio" na interpretação do nosso fórum de atendimento aos membros do Xtibia, optamos por alterar a tratativa do nome. O atendimento funciona mais como um "retorno dos usuários", ou seja, um "feedback" do que acontece em nossa comunidade. Certo? Partindo este principio, mudamos o título e descrição para que nenhum usuário novo possa interpretar de maneira errada e se confundir com os sub-fórums de suporte específico. 3º Suporte a otserv http://www.xtibia.com/forum/forum/988-suporte-otserv/ Opa, se melhoramos a área de atendimento, agora nomeada, Feedback, porque não melhorarmos nosso suporte a Otserv? Seguindo a linha de raciocínio, preservamos o que o Xtibia tem de exclusividade em relação a qualquer outro fórum atual. Áreas específicas para atendimento e pedidos de "n coisas". No entanto, estas áreas as vezes estão escondidas e se tornam de difícil acesso para usuários novos ou preguiçosos. Este problema deverá ser solucionado, com um novo fórum de redirecionamento, facilmente encontrado nas seções do Xtibia: 4º Open Tibia Client http://www.xtibia.com/forum/forum/917-open-tibia-client-oficial-brasileiro/ Entendemos que o Otclient é um projeto que foi idealizado pelo brasileiro Edubart. Tratando-se de um projeto, por si só, deduzimos que patrocinamos oficialmente tal área e que portanto nada melhor do que enquadrá-lo em nossa área de projetos patrocinados. "Ah Alê, fica muito escondido!" Toda semana estamos trabalhando em meios de divulgação que potencialize os acessos a concursos e projetos do Xtibia. Além do Facebook, excelente ferramenta de publicação, vocês têm acompanhado que o fórum recebeu uma tarja de anúncios no topo. Esta tarja muda a cada 3 dias mais ou menos! 5º Layout http://www.xtibia.com/forum/topic/229215-barra-negra/ A barra superior, que funciona como um breadcrumb em nosso fórum foi melhorada. Testamos em resoluções de 1024x768 alguns tópicos que possuem títulos grandes e conseguimos melhorar a exibição, evitando a "quebra do layout". Peço que continuem averiguando isso e reportem se encontrarem falhas. ____________________________________________________________________________ Importante: vocês notaram que nosso chat está desativado. Gostaria de aproveitar o ensejo para explicarmos a respeito. Nosso fórum das últimas semanas recebeu um número bem maior de visitas do que o acostumado. Estamos crescendo e isso é realmente muito bom e agradecemos o empenho de toda equipe e membros. Com este cenário, nosso chat passou a ter mais uso, "estourando" entre aspas, a capacidade de requisições. Isso tudo está sendo analisado e melhorado, não se preocupem. Neste meio tempo, pedimos que aguentem os ânimos até criarmos uma solução ideal! Deixo claro que estamos nos movimentando para resolver o mais rápido. Por hoje é só, a semana foi bem agitada. Desejo a vocês um ótimo final de semana e boa diversão!
    1 ponto
  46. krex

    Khorem - Atualizações

    Não vital, o projeto não está parado, o mapa e história continuam sendo feitos. Na verdade, só preciso de um sistema pra colocar ele como "pronto" e começar com os test servers. O problema é que não encontrei ninguém ainda com habilidade/disposição pra faze-lo.
    1 ponto
  47. 1 ponto
  48. • SPR & DAT Pokemon 5° Geraçao - Stigal [Download]• • Menu: ├ Informações; ├ Download; ├ PrintScreen; └ Creditos. • Informações Basicas • • Download's • [Pokemon] SPR e DAT [Pokemons 5 Geração] (4shared) http://www.4shared.com/rar/E836cXv0/Pokemon_Sprite_5_Gerao_-_Stiga.html Sprite Editor [v1.3.0] (4shared) http://www.4shared.com/rar/ZQ1w2BpH/Stigal_-_Spriter_Editor.html? Scan [Pokemon] SPR e DAT [Pokemons 5 Geração] (Virus Total) https://www.virustotal.com/file/030d85e9fe0bb5cab4e8159e3247b86a633acb35dc0773a03effe17da08cef87/analysis/1347751884/ • Prints De Algumas SPR • • Creditos • Stigal - {Master}
    1 ponto
  49. Não entendi sua pergunta leke ! 7° Pokémon indo pro depot \/ Quem estiver com problema de pokémons não indo pro cp você tem que configurar o id da cidade no depot do seu centro pokémon. É só ir pelo map editor e colocar, clicando com o botão direito no depot .. Caso não tenha a opção de escolher é po que o map editor não reconhece o item.xml como o servidor e tem que fazer uma modificação nos items.xml que está na pasta 8.54 do seu map editor Pois provavemente ele vai está algo do tipo assim, parecido com isso, não tenho como saber ao certo agora. <item id="2589" to item id="2592" article="a" name="locker"> <attribute key="type" value="depot"/> <attribute key="containerSize" value="30"/> </item> Algo desse tipo, é só substituir por isso abaixo, salvar, abrir o editor, abrir o mapa, colocar os ids das cidades e salvar o mapa. <item id="2589" article="a" name="locker"> <attribute key="type" value="depot"/> <attribute key="containerSize" value="30"/> </item> <item id="2590" article="a" name="locker"> <attribute key="type" value="depot"/> <attribute key="containerSize" value="30"/> </item> <item id="2591" article="a" name="locker"> <attribute key="type" value="depot"/> <attribute key="containerSize" value="30"/> </item> <item id="2592" article="a" name="locker"> <attribute key="type" value="depot"/> <attribute key="containerSize" value="30"/> </item>
    1 ponto
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...