Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 09/01/12 em %
-
[Advanced Reset System 2.0]
SkyTheKing reagiu a MarcelloMendes por um tópico no fórum
-= Advanced Reset System 2.0 =- By: MarcelloMkez Fala galerinha, to aqui dinovo , mas agora e com a versão 2.0 do meu 'Advanced Reset System'. E como prometido, trazendo algumas novidades: _________________________________________________________________________________________________________________________________ - Resets agora armazenados diretamente na 'DataBase', acabando com o sistema de Storages, e com o problema dos resets atrasados no look; - Opções para Abilitar e Desabilitar Condições como por exemplo: 'look = true' , [true,false] configurando como achar melhor; - E agora '[sTAGES]', para 'premmy' (Premium Account) e 'free' (Free Account); - Instala o System e cria a Tabela de Resets com o comando "/installreset"; OBS: Sistema testado em 'Mysql' não tenho certeza si funciona em 'sql'; e Testando em: 8.50 (TFS 0.3.6) e 8.6 (TFS 0.4.0) __________________________________________________________________________________________________________________________________ Vá em data/Talkactions, e crie um arquivo .lua e nomeie para advancedResetSystem.lua e Adicione Isso: --[[ <(Advanced Reset System 2.0)> Autor: MarcelloMkez. Contato: (marcello_dirt@hotmail.com) Versão: 2.0 Testado em: 8.50 e 8.60 TFS: 0.3.6 and 0.4.0 Fórum: http://www.xtibia.com/forum/topic/142463-advanced-reset-system-20/ -=[Características]=- ~( Versão 2.0 )~ - Resets agora Armazenados na DataBase; (Sem Valor de Storage) - Instala o System e cria a Tabela de Resets com o comando "/installreset"; - Resets no Look do jogador ex: 22:10 You see Marcello [Reset 2] (Level 8). He is an elder druid.; - [sTAGES] para "Premium Account" e "Free Account"; ]] --=[Functions]=-- -- installReset()' [instala o Sistema.] -- tableResetInstall()' [Verifica Se o Sistema ja foi instaladao.] -- nowReseting()' [Verifica, retorna o erro ou reseta.] -- getPlayerReset(cid)' [Pega numero de resets do player.] -- checLevelStageReset(cid)' [Verifica o Level para Resetar.] -- newReset(cid)' [Verifica todas as Condições de Reset.] -- addValue(value)' [Adiciona numero de resets.] --=[Comandos de Jogadores]=-- -- "/installreset" -- Só será usado uma vez, para instalar o sistema. -- "!resetar" -- Para Resetar. function onSay(cid, words, param) if words =="!resetar" then --[ Condições de Reset ] -- local coNdConf = { needPz = true, -- Precisa estar em Pz pra resetar? [true, false] needPa = false, -- Precisa ser Premium Account Pra resetar? [true, false] withe = false, -- Players com Pk Withe podem resetar? [true, false] red = false, -- Players com Pk Red pode resetar? [true, false] battle = false, -- Players precisão estar sem battle pra resetar? [true, false] teleport = true, -- Teleportar Player para o templo após resetar? [true, false] look = false, -- Aparecer Resets no Look do Player? [true, false] pid = getPlayerGUID(cid), -- Não Mexer. --[ Configurações do Reset ] -- resetConf = { Level = 350, -- Level Necessário para Resetar. [Valor] backLvl = 8, -- Level que voltará após o Reset. [Valor] time = 5, -- Tempo para o Player deslogar ao resetar, em segundos. [Valor] }, } --[[>> STAGES <<]]-- x=true;X=true -- Não Mexer. local stage = {Abilitar = {x}, Desabilitar = {}, --<< Abilitar Stages?? >>-- [{x};{}] -- [RESETS] | [PREMMY] | [FREE] stage1= {resets= 4, premmy= 330, free= 350}, stage2= {resets= 9, premmy= 340, free= 355}, -- EXPLICANDO e Configurando stages. (Se estiver Abilitado [Abilitar = {x}]) stage3= {resets= 14, premmy= 355, free= 360}, -- resets = Número de resets para o Stage; stage4= {resets= 19, premmy= 360, free= 365}, -- premmy = Level necessário para Premium Accounts; stage5= {resets= 24, premmy= 370, free= 380}, -- free = Level necessário para Free Accounts; stage6= {resets= 29, premmy= 380, free= 390}, -- Coloque em Ordem... stage7= {resets= 35, premmy= 400, free= 410}, -- [OBS: MARQUE UM "X" PARA ABILITAR OU DESABILITAR OS STAGES] stage8= {resets= 40, premmy= 410, free= 440}, -- EX: para desabilitar mude: Abilitar = {}, Desabilitar = {x} stage9= {resets= 45, premmy= 450, free= 450}, stage10={resets= 50, premmy= 465, free= 465}, } --[[>> FIM STAGES <<]]-- --=[Pega Valor de Resets]=-- function getPlayerReset(cid) local qr = db.getResult("SELECT `reset` FROM `players` WHERE `id`= "..coNdConf.pid..";") rss = qr:getDataInt("reset", coNdConf.pid) if rss < 0 then rss = 0 end return rss end local success = " ~~ Sucesso! ~~ \nVocê tem agora "..(getPlayerReset(cid)+1).." resets. \nVocê será deslogado em "..coNdConf.resetConf.time.." segundos." ;err = doPlayerSendTextMessage local qrt = db.getResult("SELECT `reset` FROM `players` WHERE `id`= "..coNdConf.pid..";");rss_db = qrt:getDataInt("reset", coNdConf.pid) local lvl_query = "UPDATE `players` SET `level` = "..(coNdConf.resetConf.backLvl)..", `experience` = 0 WHERE `id`= " .. coNdConf.pid .. ";" local reset_query = "UPDATE `players` SET `reset` = "..(getPlayerReset(cid)+(1)).." WHERE `id`= " .. coNdConf.pid .. ";" local nolook_query = "UPDATE `players` SET `description` = '' WHERE `players`.`id`= " .. coNdConf.pid .. ";" local look_query = "UPDATE `players` SET `description` = ' [Reset "..(getPlayerReset(cid)+(1)).."]' WHERE `players`.`id`= " .. coNdConf.pid .. ";" --=[Reseta]=-- function addValue(value) if coNdConf.look == false then doRemoveCreature(cid) db.executeQuery(lvl_query);db.executeQuery(reset_query);db.executeQuery(nolook_query) else doRemoveCreature(cid) db.executeQuery(lvl_query);db.executeQuery(reset_query);db.executeQuery(look_query) return LUA_NO_ERROR end end function nowReseting() if (getPlayerLevel(cid) < coNdConf.resetConf.Level) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "- Level Necessário Para o Reset ["..coNdConf.resetConf.Level.."]. Faltam "..coNdConf.resetConf.Level-getPlayerLevel(cid).." level's para você Resetar. -") return true end if getPlayerLevel(cid) >= coNdConf.resetConf.Level and (coNdConf.teleport == false) then doPlayerPopupFYI(cid, success) addEvent(addValue, coNdConf.resetConf.time*1000, value) else doPlayerPopupFYI(cid, success) addEvent(doTeleportThing, coNdConf.resetConf.time*900, cid, getTownTemplePosition(getPlayerTown(cid))) addEvent(addValue, coNdConf.resetConf.time*1000, value) return true end end --[sTAGES Nao mexer em nada.]-- function checkLevelStageReset(cid) local stages = { {resets= stage.stage1.resets, premmy= stage.stage1.premmy, free= stage.stage1.free}, {resets= stage.stage2.resets, premmy= stage.stage2.premmy, free= stage.stage2.free}, {resets= stage.stage3.resets, premmy= stage.stage3.premmy, free= stage.stage3.free}, {resets= stage.stage4.resets, premmy= stage.stage4.premmy, free= stage.stage4.free}, {resets= stage.stage5.resets, premmy= stage.stage5.premmy, free= stage.stage5.free}, {resets= stage.stage6.resets, premmy= stage.stage6.premmy, free= stage.stage6.free}, {resets= stage.stage7.resets, premmy= stage.stage7.premmy, free= stage.stage7.free}, {resets= stage.stage8.resets, premmy= stage.stage8.premmy, free= stage.stage8.free}, {resets= stage.stage9.resets, premmy= stage.stage9.premmy, free= stage.stage9.free}, {resets=stage.stage10.resets, premmy=stage.stage10.premmy, free=stage.stage10.free}, } local resets = getPlayerReset(cid) for i, tab in ipairs(stages) do if resets <= tab.resets then coNdConf.resetConf.Level = isPremium(cid) and tab.premmy or tab.free break end end if (getPlayerLevel(cid) < coNdConf.resetConf.Level) then err(cid, MESSAGE_STATUS_CONSOLE_BLUE, "- Level Necessário Para o Reset ["..coNdConf.resetConf.Level.."]. Faltam "..coNdConf.resetConf.Level-getPlayerLevel(cid).." level's para você Resetar. -") return TRUE end if getPlayerLevel(cid) >= coNdConf.resetConf.Level and (coNdConf.teleport == false) then doPlayerPopupFYI(cid, success) addEvent(addValue, coNdConf.resetConf.time*1000, value) else doPlayerPopupFYI(cid, success) addEvent(addValue, coNdConf.resetConf.time*1000, value) addEvent(doTeleportThing, coNdConf.resetConf.time*900, cid, getTownTemplePosition(getPlayerTown(cid))) return true end end function newReset(cid) if(coNdConf.needPz == true) and (getTilePzInfo(getCreaturePosition(cid)) == LUA_ERROR) then err(cid,MESSAGE_STATUS_CONSOLE_BLUE,"- Você Precisa estar em Protection Zone Para Resetar. -") return TRUE end if(coNdConf.needPa == true) and not isPremium(cid) then err(cid,MESSAGE_STATUS_CONSOLE_BLUE,"- Você Precisa ser Premium Account para Resetar. -") return TRUE end if(coNdConf.withe == false) and (getCreatureSkullType(cid) == 3) then err(cid,MESSAGE_STATUS_CONSOLE_BLUE,"- Você não pode resetar em condições de PK Withe. -") return TRUE end if(coNdConf.red == false) and (getCreatureSkullType(cid) == 4) then err(cid,MESSAGE_STATUS_CONSOLE_BLUE,"- Você não pode resetar em condições de PK Red. -") return TRUE end if(coNdConf.battle == true) and (getCreatureCondition(cid, CONDITION_INFIGHT) == TRUE) then err(cid,MESSAGE_STATUS_CONSOLE_BLUE,"- Você Precisa estar sem Battle para Resetar. -") return TRUE end local xy = {true,false} table.insert(stage.Abilitar, false) table.insert(stage.Desabilitar, false) if stage.Abilitar[1] == xy[1] and stage.Desabilitar[1] == xy[2] then checkLevelStageReset(cid) elseif stage.Abilitar[1] == xy[2] and stage.Desabilitar[1] == xy[1] then nowReseting() else doPlayerPopupFYI(cid, "LUA_ERROR; Configure corretamente o Sistema de STAGES!") end return true end function tableResetInstall() print(not rss_db and LUA_ERROR or "Tabela de Resets: Instalada ... [success] ") addEvent(newReset, 1000, cid) return false end if tableResetInstall() then end end --=[install System]=-- function installReset() if db.executeQuery("ALTER TABLE `players` ADD reset INT(11) NOT NULL DEFAULT 0;") then print("[MarcelloMkez] -= Advanced Reset System 2.0 por DataBase =- Instalado com sucesso!") return TRUE end print('[Advanced Reset System/MarcelloMkez] Não foi possível instalar o Sistema.') return FALSE end local tt = { "Preparando Instalação...", "Instalando: TableReset Db...", "Instalando: getPlayerReset()...", "Instalando: addValue()...", "Instalando: checkLevelStageReset()...", "Instalando: newReset() and nowReseting()...", "Finalizando Instalação...", "...", success = { "Iniciando...", "function: TableReset Db... [success]", "function: getPlayerReset()... [success]", "function: addValue(value)... [success]", "function: checkLevelStageReset()... [success]", "function: newReset() and nowReseting()... [success]", "Fim da Instalação. ", "by: ~~ MarcelloMkez ~~ \nContato: marcello_dirt@hotmail.com", inst = {"MarcelloMkez","Advanced Reset System 2.0 por DataBase" }, }, } if words == "/installreset" and getPlayerAccess(cid) >= 3 then function install() if installReset() then print(""..tt.success[7].."") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,""..tt.success[8].."") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "["..tt.success.inst[1].."] -="..tt.success.inst[2].."=- Instalado com sucesso!") else print("["..tt.success.inst[1].."] FALHA NA INSTALAÇÃO! [O sistema ja foi instalado].") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "["..tt.success.inst[1].."] FALHA NA INSTALAÇÃO! [O sistema ja foi instalado].") end return 1 end function concl(cid) local typetx = MESSAGE_STATUS_CONSOLE_BLUE print(""..tt.success[7].."") print(""..tt[8].."") doPlayerSendTextMessage(cid, typetx,""..tt.success[7].."") doPlayerSendTextMessage(cid, typetx,""..tt[8].."") addEvent(install, 1000,cid) end function finall(cid) local typetx = MESSAGE_STATUS_CONSOLE_BLUE print(""..tt.success[6].."") print(""..tt[7].."") doPlayerSendTextMessage(cid, typetx,""..tt.success[6].."") doPlayerSendTextMessage(cid, typetx,""..tt[7].."") addEvent(concl, 3000,cid) end function installDd(cid) local typetx = MESSAGE_STATUS_CONSOLE_BLUE print(""..tt.success[5].."") print(""..tt[6].."") doPlayerSendTextMessage(cid, typetx,""..tt.success[5].."") doPlayerSendTextMessage(cid, typetx,""..tt[6].."") addEvent(finall, 1000,cid) end function installCc(cid) local typetx = MESSAGE_STATUS_CONSOLE_BLUE print(""..tt.success[4].."") print(""..tt[5].."") doPlayerSendTextMessage(cid, typetx,""..tt.success[4].."") doPlayerSendTextMessage(cid, typetx,""..tt[5].."") addEvent(installDd, 1000,cid) end function installBb(cid) local typetx = MESSAGE_STATUS_CONSOLE_BLUE print(""..tt.success[3].."") print(""..tt[4].."") doPlayerSendTextMessage(cid, typetx,""..tt.success[3].."") doPlayerSendTextMessage(cid, typetx,""..tt[4].."") addEvent(installCc, 1000,cid) end function installAa(cid) local typetx = MESSAGE_STATUS_CONSOLE_BLUE print(""..tt.success[2].."") print(""..tt[3].."") doPlayerSendTextMessage(cid, typetx,""..tt.success[2].."") doPlayerSendTextMessage(cid, typetx,""..tt[3].."") addEvent(installBb, 1000,cid) end function toInstall() local typetx = MESSAGE_STATUS_CONSOLE_BLUE print(""..tt.success[1].."") print(""..tt[2].."") doPlayerSendTextMessage(cid, typetx,""..tt.success[1].."") doPlayerSendTextMessage(cid, typetx,""..tt[2].."") addEvent(installAa, 1000,cid) end function preparation() local typetx = MESSAGE_STATUS_CONSOLE_BLUE print(""..tt[1].."") doPlayerSendTextMessage(cid, typetx,""..tt[1].."") addEvent(toInstall, 3000,cid) end if preparation() then end end return 1 end --=[by: MarcelloMkez]=-- E em Talkactions.xml adicione isso: <talkaction words="!resetar;/installreset" event="script" value="advancedResetSystem.lua"/> Instalando o Sistema - Após adicionar o script em TalkActions e em Talkactions.xml Use o comando "/installreset" em jogo, OBS: o System so pode ser Instalado pelo GOD! A a instalação será mostrada no default, e no Distro! Apos isso, Sistema Instalado! 'Explicando stages: Stage 1: stage1= {resets= 4, premmy= 330, free= 350}, resets: ---- Quantidade de Resets para o stage. premmy: ---- Level que Premmium Accounts podera Resetar. (no caso ate 4 resets) free: ------ Level que Free Accounts podera Resetar. (no caso ate 4 resets) --- Bom como vcs pode ver, vai ate o 'Stage 10': stage10={resets= 50, premmy= 465, free= 465}, --- Intao irei explicar, caso queiram adicionar mais stages... Use 'Ctrl + G' com o script aberto, e digite 71, e aperte enter, logo ira direcionar para linha 71 que no caso é esta: stage10={resets= 50, premmy= 465, free= 465}, - Abaixo dela adicione uma exatamente igual, so modificando o numero do stage ficando assim: stage10={resets= 50, premmy= 465, free= 465}, stage11={resets= 55, premmy= 465, free= 465}, Agora na linha 134 vai ta esta: {resets=stage.stage10.resets, premmy=stage.stage10.premmy, free=stage.stage10.free}, Voce faz a mesma coisa adicionando embaixo da linha 134 porem mudando os numeros, ficando assim: {resets=stage.stage10.resets, premmy=stage.stage10.premmy, free=stage.stage10.free}, {resets=stage.stage11.resets, premmy=stage.stage11.premmy, free=stage.stage11.free}, Pronto, Ja esta adicionado o 'Stage 11' xD, Assim voce pode adicionar quantos stages quiser, basta configurar corretamente... Mais duvidas postem aqui. Aqui termino o post! espero que gostem, grato: ~~MarcelloMkez~~1 ponto -
AGORA NA VERSÃO 2.0 Ola amigo Xtibianos vim trazer uma novidade a vocês... sei que existem varios Baiaks por ai.. todos diferentes alguns são até iguais mais com funções inovadoras.. A um tempo atras resolvi criar um Baiakão pra mim rsrs. E pior que deu certo, em 5 dias online consegui conquistar mais de 100 players fixos online. mais acabei ficando sem tempo de resolver tudo sozinho e resolvi fechar. o server ficou parado aqui.. muitos no msn me pedirão e eu nunca tive coragem de entregar ele assim de mão beijada né guardei por um bom tempo.. Mais.... hoje resolvi dar uma olhada nele e enquanto eu via o mapa .. funções.. e outras coisas mais , acabei achando interessante eu liberar ele aqui pra vocês Xtibianos... Então chega de papo e vamos ao que Importa.... Baiak 8.60 Usando Crystal server All features, actions, funções 100% Addons 100% Spells 100% Vocações balanceadas. Estabilidade garantida. Serve save sem lag Clean 100% Talkactions GOD, CM, GM 100% MAPA Baiak Yourots Editado por mim. INQ. Quest 100% POI 100% Anihi 100% Areá VIP com Hunts e teleports 100% Sala de teleports Arenas e muito mais... LAST UPDATE VIP 1 - 100% VIP 2 - 100% Adicionado Comando !buyvip por 3kk Adicionado Novos Outfits "Elf e Vampire" Mapa com novo visual npcs concertados e melhorados Novas quests novas hunts novas arenas PRINTS... Trainers Cidade... Addon Elf... Vampire Addon... Templo... Novos Teleports no DP É isso ai galera .. já que viram um pouco do mapa.. irei postar abaixo beleza xD acho que sera util para alguem que esteja a proucura de um baiak estavel.. Se a galera curtir estarei disponibilizando ele na versão 9.44 do Crystal server... ACC GOD = god/god CREDITOS: Tryller - desenvolvedor crystal server. Erimyth - Edição, melhorias e adaptações de novas actions. Equipe Baiak Yourots. DOWNLOAD: LINK ON - >>> Mediafire <<< SCAN: CLICK AQUI - VIRUSTOTAL <- Scan atualizado com a versão 2.01 ponto
-
[Pokemon] PDA By Slicer Pokemon dash advanced editado por slicer, vários bugs retidos. Projeto encerrado! Espero que todos tenham gostado desse 1 ano de trabalho duro! Todas as atualizações: * Leiam e sigam as instruções do Change Log dentro da pasta do patch! Downlaods: PDA By Slicer With Level System v2.9 Full -> http://www.mediafire...z2afuu75zblvmvq PDA By Slicer Without Level System v1.9 Full -> http://www.mediafire...td0l0ip9ajprrbf OTClient editado 2.8/1.8 => http://www.mediafire...1lcbs1fktpm676w Atualizações: EH OBRIGATORIO O USO DESSE CLIENT ABAIXO E USEM O .PIC TB!!!!!!!!! Client v1.9/2.9 => http://www.mediafire...77i414v1hy187fj Patch v1.9 => http://www.mediafire...da4umj3ip18jrf1 Patch v2.9 => http://www.mediafire...7nt275td9afl1fy Patch v1.9.1 => http://www.mediafire.com/?i3flwa3lrd016zl Patch v2.9.1 => http://www.mediafire.com/?m4zhjgn62uow1sp Obs: Atualizaçoes mais antigas estao dentro do spoiler acima!! OTAL.DLL: OBS: caso n esteja aparecendo a barra de moves no client normal do tibia, baixem essa .dll e coloquem na pasta onde fica o Pokemon_nibe.exe ... Otal.rar Patch Correçao! Todos olhem! Bugs na nova atualizaçao? Olhe o spoiler e veja se arruma o problema! Atualizado: 08/02/13 Créditos: Otal.rar1 ponto
-
boss ressereition é um sistema simples,de facil edição,pratico e leve. mas para que ele serve? ele fas como na queles jogos que quando você mata um boss ele volta numa senguda forma mais forte,o boss poden ter mais de duas formas (ele vai cria outro boss selecionado no script, no mesmo lugar que vc mato esse boss) va em data/creaturescript e abra o arquivo creaturescript.xml e adicione essa tag <event type="death" name="br" event="script" value="bossressuretion.lua"/> va em creaturescript/script e crie uma um arquivo lua com nome bossressuretion colocque isto dentro function onDeath(cid, corpose, lastHitKiller, mostDamageKiller) boss = {["bossname"] = "sencond form name" } --configure aki ef = 42 --efeito que solta no locau onde ele morrer monster = string.lower(getCreatureName(cid)) pos = getCreaturePos(cid) doRemoveCreature(cid) doCreateMonster(boss[monster], pos) doSendMagicEffect(pos, 22) return FALSE end agora va em data/monster procure pelo arquivo xml do mostro que que adionar ao evento abra-o e adicione essa tag <script> <event name="br"/> </script> caso ja exista a tag <script> </script> apenas adione isso dentro <event name="br"/> configurando simplesmente configure a tabela boss da seguinte forma boss = {["nome do boss"] = "nome da segunda forma do boss",["outro boss"] = "segunda forma do outro boss" } deve ser igual ao que consta no arquivo xml da creatura e deve estar em letras minusculas(o nome que aparce para o player) deve ser igual ao que consta no arquivo monsters.xml(é o mesmo nome que usa para summonar, em algums caso esse nome é diferente do que aparece aos player) exemplo: boss = {["demon"] = "apocalypse", ["orshabaal"] = "morgaroth", ["ghazbaran"] = "orshabaal" } no exemplo se você matase um demon ele viraria um apocalypse,se matase um Ghazbaran ele viraria um orshabaal e se matase o orshabaal ele viraria um morgaroth obs: os nomes sempre devem estar entre aspas1 ponto
-
OTX Server 2.4 Released. [Protocol 9.6] Last Update : 17/8/2012 OTX Server - 2.4 Version (Deumion) Descripçao: Esta versão inclui um código de motor completamente atualizados com base na OTX 2.1 (com extras no sistema). Eles usam os mesmos arquivos removendo apenas // items.otb - items.xml // libs/000-constant - 101-compat.lua . Uma vez que apenas os arquivos ou identificadores de mensagens são removidas na versão. A principal inovação é que agora inclui suporte para 9.6+. E inclui grandes reparações ao seu antecessor 2.32 Distribuição é o mais usado e mais de todas as atualizações! Necessário para evitar problemas com arquivos(dll). Microsoft Visual C++ 2010 - 32Bits: Redistributable Package Microsoft Visual C++ 2010 - 64Bits: Redistributable Package Source code: Subversion client: https://otservdata.g...n/branches/0.3/ Browse: http://code.google.c...ata/source/list DOWNLOAD THE OTX SERVER 2.4 Versão [ 9.6+ ] The OTX Server 2.4 (Visual Basic) Dlls: The OTX Server 2.4 (DLL) Scan: https://www.virustot...36c5a/analysis/ Bug Report: Qualquer falha em fazer a conhecê-lo nesta edição e vai corrigi-lo o mais rápido possível. Expliquenla o seu melhor e assim será mais fácil de reparar.1 ponto
-
Ola Pessual Lindo Do Xtibia... Bom, Um Tutorial De Como Fazer outfits... Vamos Ao Tutorial: Bem, primeiro, o mais básico de tudo: abra uma imagem 32x32. Depois, arranje a cabeça de um outfit de citizen de frente, e cole na imagem. Após posiciona-la no extremo noroeste do quadrado, faça uma base. Tente copiar de um outro outfit, para você ir "pegando a manha". Não presisa caprichar muito, pois é só um esboço. Após ter a base pronta, começe os detalhes. Depois, passe linhas pretas no contorno e defina as linhas internas num tom cinza escuro. Pinte os espaços em branco num tom cinza claro e o outfit estara pronto. Se você quizer fazer um outfit pra mudar de cor depois, mantenha as cores cinzas, se não, decida a cor agora. Após sombreado, repita o processo com o personagem de costas. Caso queira fazer o outfit andando, pegue o outfit do personagem parado(antes de sombrea-lo) e mude a posição de suas mãos, pernas e tronco, afim de fazer com que ele pareça estar andando Resultado final: Lembrem-se de fazerem calmamente, atentos a cada detalhe, evitando de deixar um sombreamento artificial e um formato quadrado. Aviso: Se forem fazer algo na cabeça dele, não esitem em aumentar o quadrado do outfit. Aviso2: Lembrem sempre de alinhar os braços e os ombros.1 ponto
-
New Pet System
CallOfTibia reagiu a Makelin1 por um tópico no fórum
Bom esse system que fiz não e grande coisa mais diferente (acho) bom vamos a ele Crie um arquivo lua em talkactions e coloque function onSay(cid , words, param) local textSay = {"Sim", "Não", "Talves", "Não] intendi vc poderia repetir?"} pet = { ["orc"]= {stor=78551,price=500}, ["troll"]= {stor=78552,price=300}, ["cyclops"]= {stor=78553,price=500}, ["lion"]= {stor=78554,price=300}, ["wolf"]= {stor=78555,price=500}, ["rat"]= {stor=78556,price=300}, ["demon"]= {stor=78557,price=500}, } param = string.lower(param) if words=="!buy" then if doPlayerRemoveMoney(cid,pet[param].price) then setPlayerStorageValue(cid,pet[param].stor,1) else doPlayerSendCancel(cid,"Sorry you no have money or buying pet") end end if words=="!pet" then if #getCreatureSummons(cid) < 1 and pet[param] and getPlayerStorageValue(cid,pet[param].stor) >= 1 then local x = doSummonCreature(param,getCreaturePosition(cid)) doConvinceCreature(cid, x) doCreatureSay(cid,"Go "..getCreatureName .."",TALKTYPE_ORANGE_1) else doPlayerSendCancel(cid,"sorry no have pet") end elseif words=="!remove" then if #getCreatureSummons(cid) > 0 then doRemoveCreature(getCreatureSummons(cid)[1]) doCreatureSay(cid,"Back My Monster",TALKTYPE_ORANGE_1) end elseif words=="!conversar" then if #getCreatureSummons(cid) > 0 then doCreatureSay(cid,textSay[math.random(#texteSay)],TALKTYPE_ORANGE_1) else doPlayerSendCancel(cid,"sorry no have pet summoned") end elseif words=="!fale" then doCreatureSay(getCreatureSummons(cid)[1],param,TALKTYPE_ORANGE_1) end return true end tag: <talkaction words="!pet;!remove;!fale;!conversar;!buy" event="script" value="arquivo.lua" /> !pet nome sumona monster !remove --remove pet !fala text --pet fala !conversar --ele fala uma palavra qualquer !buy nome do pet --compra pet Creditos Mulizeu Smartbox1 ponto -
V1 exemplo como fazer pokemon falar !x E Ae Galera Do XTibia V2 nessa v2 apenas Mewtwo,Meowth,Entei que fala e deixei alakazam e gengar fala espero que gostei *-*1 ponto
-
Eu tenho algum tempo mais livre em minhas mãos para que eu tivesse mais tempo para concluir a merda. Eu sei que é muito parecido com a Dark Catedral tíbia Global, mas isso é porque eu tentei refazer tudo de que me lembro eo minimap no Tibia Wiki. Ele pode ser usado para uma porção de spawns ... (é monsterfree porque eu sou preguiçoso e não quero adicionar qualquer um XD) imagens: minimaps: download: Click me!1 ponto
-
Tutorial Como Fazer Uma Magia
simbionte1 reagiu a jamesdin por um tópico no fórum
Hoje eu ensinarei como criar uma Spell de cura estilo "Heal Editeds" para criar uma magia dessa é simplesmente fácil, só requer paciência. Então vamos ao que interessa. local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, 1) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 0, 80000, 0, 100000) function onCastSpell(cid, var) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "Healing 80k~100k.") return doCombat(cid, combat, var) end Bom esse é o script que eu tenho em meu Server. setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING) Isto é o que a spell irá fazer, nesse caso " COMBAT_HEALING " que é curar (obvio). setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) Isto será o efeito dela e a cor. EX: 845210. setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, 1) Isto é o alvo que no caso 1 = Si Próprio. setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0) Isto aqui é se a spell será agressiva, ou seja, se ela irá atacar alguém e não podera ser usada em Protection Zone. setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 0, 80000, 0, 100000) Isto é quanto ira curar. dano minimo, previsão do dano, dano maximo, previsão do dano. P: Mas como assim previsão do dano ? R: É o dano medio que irá ser causado. function onCastSpell(cid, var) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "Healing 80k~100k.") return doCombat(cid, combat, var) end Isto aqui não é necessário mexer se quiser editar o "Healing 80k~100k." pode editar mas o resto não editar! Depois disso tudo você salvará seu arquivo.lua na pasta seuot/data/spells/healing. Depois entra na spells.xml e coloque isto aqui: Agora eu irei mostrar alguns efeitos. Alguns Efeitos ficaram pequeno pois fiquei com preguiça de tirar SS dos efeitos In Game. Os tipos de magias que existem são os de Runes (Sudden Death) e os normais por fala. Bom galera é isso termino aqui meu tutorial. Vlw galerinha. Atenciosamente, [GOD] Its Me Mario1 ponto -
Novo Projeto Incentivados -> Projetos Patrocinados
Mophus reagiu a Administrador por um tópico no fórum
Atenção: O projeto evoluiu e agora se chama "Projetos Patrocinados" Galerinha, o programa de patrocínio e incentivo de projetos evoluiu e agora está beneficiando mais pessoas que queiram criar projetos interessantes para a comunidade! Nós damos preferência para projetos open source, mas você pode ter seu projeto patrocinado aqui no xtibia.com, basta apresentá-lo seguindo essas regras aqui. Hosted Forums (seu próprio fórum aqui na comunidade onde você é o moderador) Visibilidade no menu do site Visibilidade no bloco superior "Projetos Patrocinados" Medalha Partner para o projeto na base de projetos! (breve) ---- todos os benefícios do Silver Partner ---- VPS 1GB (Linux/Windows) ---- Medalha Gold Partner1 ponto -
Not Drop Loot
DarkSiders reagiu a SkyLigh por um tópico no fórum
Iae galera hoje venho trazer um script que não dropa loot como um aol so que sem precisar usar amuleto e também não e uma bless então vamos la Em data / talkactions / scripts / e renome algum arquivo.lua para loot e adicione function onSay(cid, words, param) local price = 1000 -- dinheiro que vai custa if getPlayerStorageValue(cid,1254) > 0 or not doPlayerRemoveMoney(cid, price) then doPlayerSendTextMessage(cid, 28, "Você, não tem dinheiro suficiente e/ou já tem Anti Drop.") return true end doPlayerSendTextMessage(cid, 27, "Parabéns você comprou Anti Drop, por " .. price .. " gp's") setPlayerStorageValue(cid, 1254, 1) return true end talkactions.xml <talkaction words="!loot" event="script" value="loot.lua"/> data/creaturescripts/scripts renome algum arquivo pra antidrop e adicione function onDeath(cid, deathList) if getPlayerStorageValue(cid, 1254) > 0 then setPlayerStorageValue(cid, 1254, 0) doCreatureSetDropLoot(cid, false) end return true end em creaturescripts.xml <event type="death" name="noDrop" script="antiDrop.lua"/> em login.lua registerCreatureEvent(cid, "noDrop") Créditos Skyligh (Por Criar E Pela Ideia E Postar) Skyforever (Ajudou Em Alguns Erros) gostou ? rep +1 ponto -
1 ponto
-
spells.xml: <instant name="Spell Name" words="words" lvl="35" mana="120" exhaustion="1200" script="spell.lua"> </instant> spell.lua: Assim? PS: Edite o Spell Name, words e o nome do arquivo.1 ponto
-
[Encerrado] Ajuda Pls Fatal: Could Not Determine The Map Format!
IMakarov reagiu a eduardosm14 por um tópico no fórum
hmm vc ja tentou botar esse tems.otbm xd.otbm ou ice.otbm no lugar do map.otbm talvez o map.otbm, nao e o mapa du ot....1 ponto -
Script do NPC: nomedonpc.xml: <?xml version="1.0" encoding="UTF-8"?> <npc name="NPC" script="data/npc/scripts/chave.lua" walkinterval="0" floorchange="0"> <health now="100" max="100"/> <look type="144" head="115" body="94" legs="114" feet="114" addons="3"/> <parameters> <parameter key="message_greet" value="|PLAYERNAME|, deseja obter a chave para a quest?" /> </parameters> </npc> chave.lua: Script do baú: actions.xml: <action uniqueid="1509" script="keychest.lua"/> <action uniqueid="1510" script="keychest.lua"/> keychest.lua: OBS: O baú deve ter o unique ID 1510.1 ponto
-
Dbofe (Dragon Ball) Dedicado.
8334112 reagiu a BrunooMaciell por um tópico no fórum
Brigado ^^ vou abaixa aqui de novo e testa ;D1 ponto -
@Slicer You sure Doesnt happen on me, i already tested serval times.1 ponto
-
Storages Já Usadas No Servidor.
Demonbholder reagiu a gledsonrt por uma questão
Nenhum método é completamente confiável, porque não vai te dar todas as storages no server. Mas o que você pode fazer é: Verificar ActionIDs e UniqueIDs nos arquivos action.xml e movements.xml Verificar a database, tabela `players_storage` E por ultimo, no map editor, vá em find -> unique e find -> action Com isto você terá uma boa base do que já foi usado e do que ainda não foi usado. Lembrando, você pode usar como storage valores entre 0 e, aproximando, 64000. É só encontrar alguma faixa sem uso!1 ponto -
Storages Já Usadas No Servidor.
Demonbholder reagiu a Skymagnum por uma questão
function onSay(cid, words, param) local stor = getGlobalStorageValue(tonumber(param)) > 0 and "A storage ".. getGlobalStorageValue(tonumber(param)) .. " já está em uso" or "A storage " .. getGlobalStorageValue(tonumber(param)) .. " ainda não está em uso." if tonumber(param) then doPlayerSendTextMessage(cid, 27, "Então: " .. stor .. ".") end return doPlayerSendCancel(cid, "Digite algum parâmetro(número).") end então nem testei. PS: só funciona com Global Storages dps faço com todas sono pkas Como usar !comando número de storage1 ponto -
Duvida Sanada, Enviado Ao Moderador Da Area Para Fechar e Mover! Abraço.1 ponto
-
Como Editar Npc De Gym
narutochuuu reagiu a Stigal por uma questão
Editando a "Insignia" Vá Em "Data > Lib > Gym.lua Dentro Estara: gymbadges = { ["Brock"] = 12252, ["Misty"] = 12253, ["Surge"] = 12254, ["Erika"] = 12255, ["Sabrina"] = 12256, ["Koga"] = 12257, ["Blaine"] = 12258, ["Giovanni"] = 12259} Editando As Insignias: ["NOME DO NPC"] = ID DA INSIGNIA, Npc GYM Exemplo: Oque Editar: Editar 01: Editar 02: Editar 03: Espero Ter Ajudado! Abraço...1 ponto -
function onThink(interval, lastExecution) local config = { pos = {x = 179, y = 54, z = 3}, topos = {x=794, y=228, z=7}, timer = 3 } function removeTp() local t = getTileItemById(config.pos, 1387) if t then doRemoveItem(t.uid, 1) doSendMagicEffect(config.pos, CONST_ME_POFF) end end doCreateTeleport(1387, config.topos, config.pos) doBroadcastMessage("O teleport para Boss event esta aberto e fechara em ".. config.timer .." minutos.") addEvent(removeTp, config.timer*1000*60) return true end1 ponto
-
dofile("./_woe.lua") local config = woe_config local reward = 200000 -- 200k local itemsgain = {{2113,1}, {2498,2}} -- {id_do_item, quantidade} local function EndWoe() Woe.getInfo() setGlobalStorageValue(stor.Started, 0) setGlobalStorageValue(stor.WoeTime, 0) Woe.expulsar(infoLua[2], Castle.salas.a.fromx, Castle.salas.a.tox, Castle.salas.a.fromy, Castle.salas.a.toy, Castle.salas.a.z, Castle._exit) Woe.expulsar(infoLua[2], Castle.salas.b.fromx, Castle.salas.b.tox, Castle.salas.b.fromy, Castle.salas.b.toy, Castle.salas.b.z, Castle._exit) Woe.expulsar(infoLua[2], Castle.salas.c.fromx, Castle.salas.c.tox, Castle.salas.c.fromy, Castle.salas.c.toy, Castle.salas.c.z, Castle._exit) doBroadcastMessage("WoE is finished", config.bcType) doBroadcastMessage("The castle " .. Castle.name .. " is owned by ".. Woe.guildName() ..".", config.bcType) if isCreature(getThingFromPos(Castle.empePos).uid) then doRemoveCreature(getThingFromPos(Castle.empePos).uid) end Woe.removePre() Woe.removePortals() doRemoveItem(getThingFromPos(Castle.desde).uid) Woe.save() for _, cid in ipairs(getPlayersOnline()) do if infoLua[2] == getPlayerGuildId(cid) and getPlayerLevel(cid) >= 100 then doPlayerAddMoney(cid, reward) for i=1, #itemsgain do doPlayerAddItem(cid, itemsgain[i][1], itemsgain[i][2]) end end end Woe.remove() setGlobalStorageValue(24503, -1) end function onThink(interval, lastExecution) Woe.getInfo() if Woe.isTime() then if not Woe.isStarted() then doSummonCreature("empe", Castle.empePos) doSummonCreature("pre1", Castle.PreEmpes[1]) doSummonCreature("pre2", Castle.PreEmpes[2]) doBroadcastMessage("War has started...", config.bcType) setGlobalStorageValue(stor.Started, 1) Woe.updateInfo({os.time(), infoLua[2], infoLua[3], infoLua[4]}) doCreateTeleport(1387, Castle.pos, Castle.desde) addEvent(EndWoe, config.timeToEnd * 60 * 1000) end end return true end local itemsgain = {{2113,1}, {2498,2}} -- {id_do_item, quantidade}1 ponto
-
<?xml version="1.0" encoding="ISO-8859-1"?> <mod name="ChangeMap" version="1.0" author="Vodkart" contact="xtibia.com" enabled="yes"> <config name="map_func"><![CDATA[ info = { [0] = {x=160,y= 54,z=7}, [1] = {x=144,y= 45,z=7}, [2] = {x=133,y= 39,z=7}, [3] = {x=174,y= 39,z=7} } storage = {60002,61002} positions = { {{x = 135,y = 45, z = 7},{x = 138,y = 45, z = 7}}, {{x = 172,y = 57, z = 7},{x = 176,y = 60, z = 7}}, {{x = 186,y = 55, z = 7},{x = 190,y = 55, z = 7}} } ]]></config> <event type="login" name="Check Map" event="script"><![CDATA[ domodlib('map_func') function onLogin(cid) if getGlobalStorageValue(storage[1]) == -1 then setGlobalStorageValue(storage[1], 0) end doTeleportThing(cid,info[getGlobalStorageValue(storage[1])]) return true end ]]></event> <talkaction words="/changemap" access="5" event="buffer"><![CDATA[ domodlib('map_func') local param = string.lower(param) setGlobalStorageValue(storage[2], getGlobalStorageValue(storage[2]) == -1 and 1 or -1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"você acabou de dar "..(getGlobalStorageValue(storage[2]) == -1 and "start" or "stop").." no map change.") return true ]]></talkaction> <globalevent name="ChangeMap" interval="1200" event="script"><![CDATA[ domodlib('map_func') function onThink(interval, lastExecution) if getGlobalStorageValue(storage[2]) <= 0 then doBroadcastMessage('O mapa será mudado novamente em 20 minutos.') setGlobalStorageValue(storage[1], getGlobalStorageValue(storage[1]) < #info and getGlobalStorageValue(storage[1])+1 or 0) for _, pid in ipairs(getPlayersOnline()) do local check = true for _, pos in ipairs(positions) do if isInRange(getCreaturePosition(pid), pos[1], pos[2]) then check = false end end if check == true then doRemoveConditions(pid, true) addEvent(doRemoveConditions, 2000, pid, true) doCreatureAddHealth(pid, getCreatureMaxHealth(pid)) doCreatureAddMana(pid, getCreatureMaxMana(pid)) doTeleportThing(pid, info[getGlobalStorageValue(storage[1])]) end end end return true end]]></globalevent> </mod> aqui é a alteração 1° positions = { {{x = 135,y = 45, z = 7},{x = 138,y = 45, z = 7}}, {{x = 172,y = 57, z = 7},{x = 176,y = 60, z = 7}}, {{x = 186,y = 55, z = 7},{x = 190,y = 55, z = 7}} } se eles estiverem por exemplo entra a posição {x = 135,y = 45, z = 7} e a posição {x = 138,y = 45, z = 7} eles não serão teleportados pode adicionar mais... a 2° alteração eu coloquei um Event pra depois de 2 segundos retirar as conditions de novo ._. addEvent(doRemoveConditions, 2000, pid, true) -- 2000 = 2 segundo a 3° alteração é o comando que eu coloquei, é só usar o comando: /changemap1 ponto
-
Akilo e somente um WARNING , Legenda : Um Aviso que a um erro na versao do seu servidor so que um erro nao muito grave que erros graves passam toda hora este e somente 1 vez1 ponto
-
[Crio] Peça Sua Spell Aqui
Pepeco reagiu a Newtonnotwen por uma questão
Não, mas tem como com o "OTItemEditor".1 ponto -
Rank Frags?
vidalokkka reagiu a notle2012 por uma questão
já olho esse http://www.xtibia.com/forum/topic/144807-top-frags/1 ponto -
Ajudem Aque No Rme 8.60
Erimyth reagiu a VictorTasquin por uma questão
Abra a pasta do seu OT, datas/items, existe 2 arquivos. Items.xml e Items.otb. Copie os dois e cole na pasta Meu computador/Disco Local C/Arquivos de Programas/Remere's Map Editor/data/8.6 (Pasta 8.6 do remeres). Tente executar o RME e refazer as paredes. Se não resolver poste aqui.1 ponto -
[Encerrado] [Pokemon] Dúvidas? - Pda
MauricioPC reagiu a zerefshirou por um tópico no fórum
Shinys de NPC em Hunt? Ja colocaram negocio de "bater no boost", agora isso, vou fazer o hyper beam no fim de semana (ou deois de fazer os moves do ricardo) e postar e sair daqui pq ta voltando a ficar ruim e não é de hoje q to pensando nisso de novo e.e1 ponto -
Doing Tile!
El9Diablo reagiu a Newtonnotwen por um tópico no fórum
Esse script cria tiles no chão. Abra actions.xml e adicione: Agora em data/actions/scripts crie um arquivo chamado dotile.lua e adicione: Editando: -Vermelho: Id do tile -Verde: Localização do tile Para adicionar mais posições faça o seguinte: Adicione o seguinte arquivo antes de doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945): Editando: -Vermelho: Id do item -Verde: Posição (x,y,z) Ex: -Laranja: Parte adicionada Adicionando no RME: Imagem:1 ponto -
1 ponto
-
Tutorial Avançado De Sprites
GuuVicentini reagiu a tomanenem por um tópico no fórum
Recomento que antes leiam o Tutorial postado pelo tomanenem: Mega Curso De Sprites [ÍNDICE] Artigo 1: Realidade do Sprite 1 - Proporção 2 - Coerência 3 - Pintura avançada 4 - Sombreamento Artigo 2: Efeitos de Aparência - Cromagem - Petrificação - Elemental do Fogo - Elemental do Gelo - Brilho externo - Corrente ( Chain armors...etc ) Artigo 3: Tópicos especiais de Pixel Art Swords - Swords - Broadswords - Laminas retorcidas Clubs - Em 90 graus - Em 45 graus Axes - Laminas - Cabos Armors - Ombreiras - Peitoral Legs - Desenho - Sombreamento simples Artigo 4: Perspectiva - Paredes - Mesas - Humanoides - Quadrúpedes - Grama - Plantas de Decoração - Árvores - Pedras Artigo 1: Realidade do Sprite Proporção Bom, começando esse nosso novo tutorial de sprites gostaria de chamar a atenção dos spriters que ja possuem certa experiência a ficarem atentos às proporções de seus sprites. Exemplo 1 Como exemplo fiz essa Armor sem muitos detalhes ou efeitos de sombreamento, o objetivo é mostrar a vocês como uma proporção errada pode estragar um sprite: Aparentemente, não nos parece um sprite ruim, na verdade ele tem potencial...talvez sombreando ali na esquerda...o ombro principalmente, clareando o lado direito nos pontos de brilho pra dar aquele contraste e tal...é ficaria bacana! Mas olhem só para a entrada do pescoço: Quem tem um pescoço maior do que o próprio peitoral? Seguindo proporções normais provavelmente a armadura ficaria presa nas clavículas do guerreiro, quando o mais correto seria estar no trapézio. Conclusões: Noções anatômicas são sempre bem vindas. Exemplos Exemplo 2 Geralmente Axes bizarros e non-sense fazem muito sucesso entre a galera, mas em um contexto do jogo todo e exagero bizarro e retardadisse TEM QUE FAZER SENTIDO. Se algum zé linguiça me vem e fala que isso é um axe de ELFO. Podemos parar a conversa por ai haha. Cabo pequeno, lamina bizarra de grande. Ele poderia ser um machado de anões...sim, ferreiros, pequenininhos e fortões...sim, mas ele provavelmente teria que segurar com as duas mãos mas esse machado tem lamina dos dois lados, logo o anão iria provavelmente se machucar, outra coisa é o cabo, quando que um cabo TRANÇADO de madeira iria suportar 450 oz de lamina de titanio? hahaha É preciso pensar nisso. Deveriamos ou aumentar o cabo ou diminuir a lamina, como temos só 32x32 de dimensão o certo é diminuir a lamina. Exemplo 3 Muitas pessoas gostam de usar esses prolongamentos do outline ( formato em preto ) pra dar uma aparencia de uma superfície mais afiada...bom eu digo que isso não é necessário. A aparencia de superfície afiada aparece quando vc faz um bom uso do contraste ( geralmente usando branco na parte mais externa da lamina do axe e depois usando uma linha escura ( que eu chamo de linha de separação, vamos ver mais pra frente ) para separar o corte (branco) do resto da lamina. Não sei se vcs ja tiveram a oportunidade de ver ferro derretido, mas o ferro derrete e quando se quebra para molde enquanto ele ainda está aquecido ele forma esses fiapos. Portanto a aparencia que a superfície tem passa longe de ser afiana, sendo mais aparente o fato de que ela foi mal manuseada durante o processo de confecção. Coerência Detalhes no Sprite Exemplo 1 Mais uma característica importante para fazer um sprite realista é a Coerência, ou seja, tudo no sprite deve fazer sentido. Tudo deve ter um porque de existir ali. Vejmos então a nossa Armadura: Bom, logo de cara, percebemos que ela possui uma capa, bacana! Mas onde a capa esta presa? Exato. Não se pode dizer "Po, acho que está atrás da armor...tem que estar, não?". A pessoa que ve seu sprite não pode ter dúvidas do que esta vendo. Então vamos concertar isso: Agora sabemos onde a capa esta presa =] Exemplo 2 Em escudos isso costuma acontecer bastante, vou postar um exemplo meu para vocês entenderem. A algum tempo fiz esse escudo: Certo, agora pensem comigo. Imaginem esse escudo com essas divisões na madeira em uma batalha...Agora imaginem nosso herói sendo atingido por um war hammer bem no meio do escudo ( E consequentemente no meio da madeira, mas na divisão que eu pus)...sim iria quebrar em mil pedaços, no mínimo. E a proteção seria 0. Agora, se tivessemos um escudo de madeira corrida mesmo, sem divisões ( que são rachaduras de certo modo ) o impacto seria distribuido pela madeira e ela iria resistir mais a ele. Logo: Acho que assim seria mais coerente de se desenhar um escudo de madeira. Detalhes no nome Bom a algum tempo eu fiz essa armadura, que na verdade e um Robe. Existe uma enorme diferença entre eles apesar de um robe ser usado como armor. E aqui está a diferença: Robe é igual a uma bata, uma roupa cerimonial ou uma vestimenta encantada, mas de pano. Isso significa usar cores menos saturadas e com pouco brilho. King's Robe Uma armadura é algo mais armorizado mesmo, com peças de metal, muito mais brilhante e com mais cores saturadas King's Armor [cred: Alex - Redshrike] Logo o nome que vc escolhe também é importante na coerência. Pintura Avançada - Método do Modelo de Gradientes [Desculpem pelo atraso no Tutorial mas com a facul e td mais não tive tempo de postar mais cedo] Bom, agora que encaramos o sprite como uma diversão que requer certa seriedade para ser bem feita vamos desenvolver nossa técnica de pintura. Para quem acompanhou o Tutorial Básico de Sprites não deve ser difícil relembrar dos Orbs da Oficina de Pintura, na verdade esse método é mais fácil para quem esta começando porque em um globo sombreado é mais fácil visualizar quais tons se usará no sombreamento de um sprite. Como este tutorial é direcionado aos que já possuem uma certa experiência, eu aconselho o Modelo de Gradientes que se baseia no seguinte conceito: Todos com certeza conhecem muito bem essa palheta: Cor/Definir Cores Personalizadas: Como podem ver todas as cores possuem tons que de certa forma misturam elas com outras cores, isso é nada mais nada menos do quê?... Isso mesmo, ANTI-ALIASING. Mas vamos abordar isso mais pra frente, o importante aqui é saber escolher os tons certos para começar a pintar, tendo em vista que vc precisará de sombra e luz...e ainda precisará de tons medianos para caracterizar as regiões que não recebem nem muita luz nem possuem muita sombra, e ainda por cima, precisa achar tons entre todas elas pra poder fazer AA. Ufa, coragem meus amiguinhos haha Preparei um sprite para tentar ilustrar a situação: Bom, o sprite possui fins ilustrativos então também não precisamos de muitos efeitos, reparemos no sombreamento. Antes de começarmos um sprite devemos saber que cor usaremos, quando escolhermos precisamos escolher os tons claros e escuros para formar nosso modelo de gradiente que usaremos para pintura do sprite. E aqui vão duas novidades pra vocês: Bom, continuando com nosso amigo Guarda chuva, percebemos que separei vários gradientes de cinza, levemente azulado. Muitas pessoas tem dúvidas em que tom usar para sombra então eu fiz uns testes. E VOU DAR DE BANDEJA PRA VOCÊS A Cor vc escolhe mas os Tons de Luminosidade que definem sombra e luz são: A cor vcs escolhem mas se eu fosse traçar um sombreamento básico seria com esse padrão ( demorei pra fazer um haha ). Percebam que sendo um padrão, é dever e obrigação fugir dele algumas vezes! Ele está sendo postado aqui porque é um tutorial pra quem tem dificuldade em sombreamento no que diz respeito a escolha de tons. Mas cada um deve personalizar seu sombreamento. Aqui um exemplo de Ombreira de Armor composta de tons nesse padrão. Observem como o sprite fica limpo: [Cred: Tim e Galiant ] COR Agora, pensando um pouco na cor, o que temos que considerar? Certo, já somos spriters experientes e já temos em mente que o jogo de luz não é como no jardim de infância onde dizemos que o Ouro, assim como o Sol, é Amarelo. O ouro é um material que possui reflexos intensos de luz amarelo claro e sombras também intensas de marrom escuro, são geralmente cores bem saturadas e que chamam atenção. No exemplo: Emerald Myth Mas existe também o ouro envelhecido, aqueles não polidos e com cores menos saturadas com brilho mais fraco. Se vc quer que seu sprite seja de ouro envelhecido, não faz sentido usar cores ofuscantes com alta luminosidade e contraste. Madeira Uma coisa importante sobre madeira, muitos não sabem disso mas pensando não só na estética ( Beleza ) do sprite mas sim no sentido que ele precisa ter, eu considero errado o uso de determinados tons para classificar a madeira de determinadas armas ou estruturas de casas ou mobílias. Em geral, madeiras de cor clara são utilizadas para confecção de lális, réguas, martelos de obra, etc. Não é uma coisa que se pense sempre por isso estou aqui pra abrir a mente de vocês: Madeiras claras, em geral são utilizadas apenas para confeccionar ( criar ) produtos que suportem uma carga baixa ( pouco peso ) porque são pouco resistentes. Madeiras mais escuras já são utilizadas pra construção de casas, pousadas, pilastras, e móveis principalmente...porque são madeiras mais compactas e rígidas. Acontece que móveis da sala de estar, portas de armário, mesinhas, de certa forma suportam pouco peso, uma mesa de jantar costuma ser de madeira escura. Sem contar o verniz, que muitas vezes influencia na cor da madeira além de dar brilho ( que não é uma propriedade comum de madeira ) Pedras Pedras são formadas pela união de vários sais cristalizados. Com isso temos 3 tipos de Pedra: Rochas(Stones) Sedimentares, Magmáticas e um tipo especial que é a gema( Gem ). Obviamente eu não sou geólogo e não estou dando conceitos 100% certos mas achei mais didático dividirmos assim. Pedras Magmáticas: Pedras escuras, vindas do magma que esfriou. Tonalidades: Baixa luminosidade, Baixa Saturação geralmente de cor negra com um leve sombreamento em cinza. Pedras Sedimentares: Pedras de diversas cores mas em geral de cor clara. Tonalidades: Variam do cinza-azulado ao branco-amarelado, possuem níveis de saturação medianos e geralmente não possuem muito brilho, logo para fazer os pontos iluminados geralmente usasse um cinza claro mas sem muito contraste com o resto da pedra. Gemas Essas sim possuem diversas cores, são bem brilhantes e simbolizam realeza e poder, muitas vezes. Tonalidades: Contrastes fortes com uma porção(menor) muito clara e uma porção de tonalidades medianas(de tamanho médio) separadas de uma porção bem escura para dar o contraste. Costumam ser usadas para enfeitar cabos de armamentos ou coroas, e algumas armaduras. Sombreamento Neste quarto tópico do nosso primeiro artigo, vamos tratar do sombreamento dos sprites. A técnica do sombreamento é na verdade mais simples em muitos casos do que realmente imaginamos. Lógicamente todo sprite tem um sombreamento diferente de acordo com a proposta dele ( Laminas diferentes de espadas, sombra de uma ombreira multipla em armaduras, acessórios em escudos, etc ). Neste tópico vamos tentar generalizar o sombreamento e entender algumas coisinhas importantes, para isso utilizaremos essa armadura que fiz! Heavy Armor Em Resumo: ...Galiant Racapitulando: Na pintura é possível utilizar 7 tons diferentes da mesma cor de acordo com a luminosidade para gerar gradientes de luminosidade ( sombreamento ). Vamos aprender agora como utilizar estes tons: 1 - Linhas de Separação - Luminosidade 50 / Luminosidade 80 Um dos piores erros dos spriters experientes é que eles dominam bem o AA. Isso é ótimo e um bom sinal para a maioria, mas é preciso ter atenção para não deixar o sprite com um aspecto borrado. As Linhas de Separação existem para identificar todas as partes que compõe o sprite e geralmente usamos tons de baixa luminosidade para criá-la como tons de Luminosidade 50 e/ou 80. Exemplos de linhas de separação formadas pelos tons de menor luminosidade do sprite. 2 - Sombreamento em Cavidades - Luminosidade 50 A representação de cavidades só é possível quando se utiliza um forte contraste em relação ao sprite como um todo. Percebam que o sprite como um todo possui mais brilho (graus de luminosidade maiores) do que o tom usado para colorir as cavidades(o que é óbvio já que ali não se recebe luz). Percebam também que a linha de separação da ombreira possui mais luz que a cavidade: Tons de menor luminosidade usados para caracterizar Cavidades(pontos que menos recebem luz em um sprite). Como fundo de ombreiras e interior de armaduras, onde entra a cabeça. Por isso sempre utilizamos tons de Luminosidade 50, a menor luminosidade que podemos usar já que em Luminosidade 0 temos a cor Preta que utilizamos no contorno. Sombreamento Global (Global shading) - Maiores Luminosidades à esquerda. Menores Luminosidades à direita. Observem que estamos usando os mesmos tons de luminosidade sempre, só que no lado mais sombreado utilizamos tons de baixas luminosidades mais vezes e ocupando uma área maior. Também não utilizamos no lado esquerdo tons de luminosidade acima de 173. No lado direito, utilizamos tons mais claros em maior área e geralmente usamos tons com luminosidade 200 ou 220 e jamais usamos tons de luminosidade abaixo de 110 nas áreas mais iluminadas. Estes tons de baixa luminosidade servem para fazer Efeito de sombra e também Antialiasing com os tons de Luminosidade 50 que utilizamos nas cavidades Sombreamento Global Efeito de Sombra Efeito se sombra é o efeito no qual certas partes do sprite refletem a luz que chegaria ao resto do sprite, fazendo com que tais partes que não recebam luz tenham tons de luminosidade menores do que a maior parte do sprite, caracterizando a sombra.( oh! ) Imaginando uma câmara escura, e considerando o sistema de iluminação do Tibia é isso que eu imagino: Temos: 1 - Luz intensa vinda do Noroeste chegando a porção da esquerda do sprite logo essa porção iluminada precisa receber tons de luminosidade altos ( 150, 173, 200 e 220 ) 2 - Como a armadura é cilindrica, o lado direito recebe menos luz. Contudo, não fica no breu total, porque a luz vinda do noroeste reflete em outras superfícies e esse reflexo faz com que parte da luz volte para a armadura, só que com uma intensidade de luminosidade menor ( logo, utilizamos tons de luminosidade menor no sprite - Luminosidade 80, 110; 150 e 173 nos locais mais iluminados ) Lugares que precisam ter sombra: 1- Embaixo de ombreiras - Tanto nas cavidades quando no peitoral já que a ombreira reflete grande parte da luz. No lado esquerdo não é preciso fazer mais de duas camadas de sombra. Já no direito o mínimo a fazer são duas camadas. 2- Entrada para pesçoco - Recomendo usar todos os tons de luminosidade nessa cavidade fazendo o efeito que eu chamdo de Dithering que não é nada mais nada menos do que misturar os tons em duas camadas pra dar um auxílio ao AA. Exemplo de Dithering: 3- Lado direito em Sombreamento Global - Utilização de Tons de baixa luminosidad eno lado direito. 4- Partes mais extremas de armaduras: - Geralmente armaduras tem um aspecto cilíndrico, então as porções laterais precisas ser mais escuras do que as porções do meio( peitoral, abdomen e pescoço ). Sendo que a extreminado do lado direito é mais escura do que a extreminado do lado esquerdo. Sentido da luz no sombreamento cilíndrico acromático. Artigo 4: Perspectiva - Paredes Bom, galera, fazer paredes realmente não tem muito segredo: - Coluna suporte: Apenas pegue um quadrado 8x8 desenhe uma diagonal no meio dele, copie e cole ligando as extreminades nas proporções da parede Tijolos Bom, para fazer tijolos temos uma técnica bem simples: Geralmente não se usa cores muito saturadas, eu usei nos modelos só pra indicar de onde vez a luz =] Ahh sim...a diagonal surge do meio do tijolo...meu exemplo não ficou dos melhores mas quebra um galho rs Humanóides Certo galera, finalmente vamos ter uma perspectiva que é do interesse de todos, suponho eu hahaha e uma das coisas que tenho me especializado nesses ultimos meses. Bom... Pra perspectiva humanóide não há nada mais do que seguir uma coisinha básica que aprendemos na escola que antigamente não servia pra muita coisa mas AGORA ela nos começa a ser útil...estou falando da famosa GEOMETRIA. Sim, a começar pela perspectiva em si. Perspectiva . Caso perguntem, a perspectiva do Tibia é um estilo de Pixel art no padrão "Top down isométrico em 45 graus", vcs ja devem saber disso e é sempre bom passar aos que não sabem caso pensem em procurar mais sobre o assunto ( pixel art ) que eu recomendo ^^. Bom o macete é bem simples: Primeiro: A cabeça deve ser OVAL em 45 graus, e não Redonda como a maioria pensa. Segundo: Traçando uma linha diagonal atrás do olho esquerdo DO PERSONAGEM ( o que está a sua direita )...temos que observar que essa linha termina no ultimo dedo do pé esquerdo do personagem ( o pé mais a sua direita ) Isso garante uma perspectiva diagonal perfeita. Terceiro: Todos os componentes esqueléticos e musculares devem estar paralelos. Isso inclui ombros, braços e mãos, que são os mais frequentes erros. Créditos: Galiant e Eu Por Ajuda Em Hospedar e Outras Coisas1 ponto -
primeiramente quero dizer que eu inventei isso quem disser que ja viu em algum outro lugar me avise pois sera imitaçao esse sistema eu inventei a alguns meses pra tibia 8.4 ainda nao testei no 8.5. Va em Data/actions/scripts/ crie um arkivo chamado clone.lua ai dentru vc coloque isso function onUse(cid, item, frompos, item2, topos) local outfit = getCreatureOutfit(item2.uid) if item.itemid == 2306 then doSetCreatureOutfit(cid, outfit, 3600000 ) doSendAnimatedText(topos,"Cloned!!",12) doSendMagicEffect(getPlayerPosition(cid),27) end end agora va em actions.xml digite isso em qualquer linha -Bomba Clonadora- <action itemid="2306" script="clone.lua" /> agora praa vc ter tudo direitinho va em items/items.lua ache a ID 2306 e coloque o nome Bomba Clonadora assim: <item id="2306" article="a" name="bomba clonadora"> <attribute key="runeSpellName" value="adevo grav clone"/> <attribute key="weight" value="120"/> <attribute key="charges" value="100"/>1 ponto
-
function onLogin(cid) if isVip(cid) == TRUE then if(isInArray({5, 6, 7, 8}, getPlayerVocation(cid))) then doPlayerSetVocation(cid,getPlayerVocation(cid)+4) end elseif isVip(cid) == FALSE then if(isInArray({9, 10, 11, 12}, getPlayerVocation(cid))) then doPlayerSetVocation(cid,getPlayerVocation(cid)-4) end end return TRUE end1 ponto
-
Galera do xtibia, Vejo que ninguem posta um servidor de dbko completo com todas vocaçoes novas adicionadas. Entao venho aqui pedir pra alguem ajuda em dizer como eu faço pra colocar uma sprite dentro do client e depois como eu faço pra colocar as magias, skills, bufs, transform do personagem na pasta do servidor. Se eu conseguir colocar a vocaçao eu posto aqui o servidor completo com as transform novas para download na sessao download!-1 pontos