Ir para conteúdo

gustavof

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Curtir
    gustavof recebeu reputação de Henrique Gaudard em (Resolvido)[Pedido] Cassino Machine   
    - Aumentando a chance e diminuindo a porcentagem dificulta a possibilidade de ganhar
    Ou seja
    Toda vez que o script é executado, ele gera um numero entre 1 até o valor chance, depois verifica se esse numero aleatório é menor ou igual a porcentagem, se for, o player ganha o premio.
    Com isso, acredito que para os valores de 0.5% seria interessante os valores:
    chance = 1000
    porcentagem = 5
     
    Não ligo pra REP.
  2. Curtir
    gustavof deu reputação a GOD Vitor em SPR otPokémon 14.42 (04/03/18)   
    Eae galera, venho trazer para vocês em primeira mão a SPR mais recente do otPokémon que está na atualização 14.42 (04/03/2018). A SPR vai completa, com todas as sprites do otPokémon.  
    Screenshots    
    Informações Além das sprites exibidas nas screenshots acima, há novos addons, etc.   Download  
    Scan
      Créditos otPokémon - Pelas sprites; GOD Vitor - Por disponibilizá-las.
  3. Gostei
    gustavof deu reputação a Leohige em The Ruby Server - Base Pokémon TFS 1.2 - 9.80   
    The Ruby Server - Base Pokémon
    Ao olhar as diversas bases que podem ser encontradas aqui no fórum e em outros locais da internet, pude ver que todas elas carecem de qualidade. Todas estas bases são feitas utilizando gambiarras para diversos sistemas funcionarem, e com isso vários problemas surgem, como de sistemas que não funcionam direito, e o mais importante, com um desempenho extremamente baixo, gerando apenas servidores instáveis. Com isso eu decidi que iria começar a desenvolver uma base para servidores relacionados a Pokémon, com dois objetivos. Um dos objetivos é ganhar mais conhecimento em cima da linguagem de programação C++, o outro objetivo é disponibilizar uma base completamente estável, funcional e de fácil configuração e desenvolvimento para servidores de Pokémon, para que mais ótimos trabalhos possam surgir. Este projeto também irá incluir um cliente próprio e estável, junto com um website.
     
    Também planejo criar uma espécie de Wiki para o servidor, cliente e website, com o objetivo de auxiliar quem for desenvolver em cima deste servidor, e também aqueles que pouco entendem do assunto relacionando a criação de escripts, Pokémon, spells e etc.
     
    Alguns poucos sistemas foram implementados no servidor por ora. Sistemas como o de catch e de goback serão implementados mais para frente, quando outros sistemas forem completamente implementados, como o sistema de configuração de Pokeballs, criação de Pokémons e sistema de shinys. Estou visando a qualidade do servidor como um todo, por isso algumas coisas irão demorar para aparecer.

    O sistema de Pokeballs e de criação de Pokémon já está bem encaminhado, e um sistema de gêneros também já está pronto com fácil configuração, onde o spawn destes Pokémon com sexo será por % igual aos jogos da franquia. Um sistema de surgimento de Ditto aleatório já está praticamente implementado, onde um Pokémon aleatório pode ser um Ditto disfarçado.
     
    [+] Informações do Servidor
    Baseado em: TFS 1.3
    Protocolo: 10.98
     
    [+] Informações do Client
    Baseado em: otclient 0.6.6

    [+] Informações do Website
    Baseado em: nenhum
    Desenvolvido em: PHP (por ser o mais comum na comunidade)
     
    Como contribuir?
    Eu gostaria muito que a comunidade ajudasse no desenvolvimento deste projeto, pois o mesmo será disponibilizado para todos, e para contribuir não necessariamente é preciso entender de programação. Você pode também ajudar testando e reportando os bugs encontrados no repositório do projeto no GitHub, assim como com sugestões e ideias de mudança/implementação no servidor através do próprio repositório ou através do Discord, ou ajudar na criação de guias para o website do projeto.
     
    Links
     
    [+] RubyServer - GitHub
    https://github.com/rubyserver/rubyserver
     
    [+] RubyClient - GitHub
    https://github.com/rubyserver/rubyclient
     
    [+] RubyServer - Website
    https://rubyserver.github.io/rubyserver/
     
    [+] RubyServer - Discord
    https://discord.gg/XTrZGpy
     
    Algumas Imagens
     
     
     
     
     
  4. Curtir
    gustavof deu reputação a Martim Tiburcio em Seu Último Trabalho   
    Praticando,
     

  5. Curtir
    gustavof deu reputação a Spriter Draiman em Seu Último Trabalho   
    Vamo dar uma reanimada nisto daqui..
     
     
     
     
     
     
     

  6. Curtir
    gustavof deu reputação a peonso666 em OpenTibia Sprite Pack   
    OpenTibia Sprite Pack é um projeto pra viabilizar a concretização de servers de OpenTibia sem infringimento de leis de copyright e propriedade intelectual. Os sprites são distribuídos nos termos da licença Creative Commons Attribution 4.0 International.
     
    Sem pressão nenhuma pra participação, também não vou jogar a ladainha de que é uma oportunidade pros senhores mostrarem o trabalho de vocês, a oportunidade é pra contribuir com a comunidade de OpenTibia, assim como tem gente da programação que colabora com os projetos abertos.
     
    É ventilado há anos que o último passo para se desligar totalmente do conteúdo legalmente de direito da CipSoft é a disponibilização de gráficos. Já temos diversos servidores (atualmente o TFS da série 1.x o mais popular), e o OTClient, minha intenção é administrar a criação do pacote de gráficos para viabilizar esse salto. O pack inicial já está disponível com uma série de gráficos disponibilizados pelos próprios autores em diversas comunidades, o próximo passo é montar uma spritesheet única e então os arquivos para o cliente e servidor, respectivamente de extensão dat, spr, otb e xml.
     
    Orientações básicas para as contribuições:
    - Todos os sprites devem ter o autor identificado.
    - Todos os sprites são de livre uso.
    - Todos os sprites devem ser adequados a utilização em OTServ, no que diz respeito a tamanho e perspectiva (32x32 e 64x64 pixels; perspectiva 45°)
    - Todos os sprites devem ser conteúdo original, nenhuma alteração de cores, edição ou utilização de propriedade intelectual alheia como Pokémon/Animes e etc.
     
    Lista de autores: https://github.com/peonso/opentibia_sprite_pack/blob/master/AUTHORS.md
     
    Tópico central na OTLand: https://otland.net/threads/opentibia-sprite-pack.254815/
     
    GitHub: https://github.com/peonso/opentibia_sprite_pack
  7. Curtir
    gustavof deu reputação a goldentivit em [Pedido] Sprite de Espada   
    Não ficou a melhor coisa do mundo, mas acho que pode quebrar o galho enquanto alguém não manda uma boa
     

  8. Curtir
    gustavof recebeu reputação de jeffersonxvr em Mover item entre slots   
    Qual a dificuldade de conseguir mover um item de um slot para o outro com outro item?

     
    Tentei olhar na source, baseado no sistema do Tibia da sword  e o shield, mas acredito que a versão que estou utilizado do DxP não da suporte pra isso. Alguém tem alguma ideia para conseguir trocar esses itens de slots?
     
  9. Curtir
    gustavof deu reputação a luanluciano93 em Layout Naruto ~   
    Eai pessoal, to fazendo aqui um layout pra um amigo .. o que acharam?
     
    HOME
     
     
    SHOP
     
    GUILDS
     
    ACCOUNT PAINEL
     
    ENQUETES
     
     
    Críticas plx!
  10. Curtir
    gustavof deu reputação a Dwarfer em (Resolvido)Script Inteligente de Invasão para Evento   
    Segue o mod:
     
     
     
    A configuração é autoexplicativa, mesmo assim, para que não restem dúvidas:
     
     
     
    Adicione no arquivo do boss que será criado na boss area, antes de </monster>:
     
    <script> <event name = "InvasionBossDeath"/> </script>  
    Lembrando que o evento só será executado caso o boss esteja dentro da boss area. 
  11. Curtir
    gustavof deu reputação a Rusherzin em Função print_r   
    Nos últimos dias tive problemas para ler os dados de funções que retornam tabelas (não tinha acesso a source da função no momento para ir checar quais eram os dados presentes) então resolvi fazer essa função bem simples para printar os dados das tabelas no console. Ela faz basicamente a mesma coisa que a função print_r do PHP só que é um pouquinho menos organizada. Enfim, se souber a estrutura de uma tabela, vai entender o output dessa função e vai ser bem útil.

     
    function print_r(tabela) if type(tabela) ~= "table" then return tabela end local result = "{" for ind, x in pairs(tabela) do x = (type(x) == "table") and print_r(x) or x..(ind==#tabela and "\n" or ",\n ") result = result..'['..ind..'] = '..x end return result.."}" end Um exemplo de uso aleatório seria:
    - Tu está trabalhando com uma função que retorna um array e ele é assim: {7, 6, 5, 4, 3, {"hi", "bye"}, "great"} (só que tu não sabes, óbvio), então tu usa a função print_r na função que retorna esse array e o resultado será assim no console:

  12. Obrigado
    gustavof deu reputação a OfWar em (Resolvido)[Pedido] Cassino Machine   
    @gustavof
    Vlw, mt obg, dps qlq coisa se eu precisar te mando o link dos tópicos pd ser?, vlw me ajudou demais, tmj
  13. Curtir
    gustavof recebeu reputação de KotZletY em (Resolvido)[Pedido] Cassino Machine   
    Modifiquei aqui, vamos ver se é realmente o que você quer.
     
     
    - Aumentando a chance e diminuindo a porcentagem dificulta a possibilidade de ganhar
    - A quantidade de backpacks para ganhar
    - A quantidade de itens dentro de cada backpack
    - Os itens dentro da backpack vão ser aleatórios e podem ser repitidos
    - Defina os itens dentro de config.itens separando por virgula
     
  14. Obrigado
    gustavof deu reputação a OfWar em (Resolvido)[Pedido] Cassino Machine   
    Boa Noite Galera Do TK!
    Vim aqui pedir outra ajuda para vocês. preciso de uma script que o Player clique no Machine(ITEM) e ele tem chance de ganhar 250k + pra ele ganhar tem que ter sorte e vai gastar 5k, Já procurei tudo e não achei essa script, achei uma parecida, porém essa aqui não tem chance e ele ganha toda hora 250k, alguem pode me ajudar? pfv
    TFS 0.4
    TIBIA 8.6
    +REP
  15. Curtir
    gustavof recebeu reputação de OfWar em (Resolvido)[Pedido] Cassino Machine   
    Modifiquei aqui, vamos ver se é realmente o que você quer.
     
     
    - Aumentando a chance e diminuindo a porcentagem dificulta a possibilidade de ganhar
    - A quantidade de backpacks para ganhar
    - A quantidade de itens dentro de cada backpack
    - Os itens dentro da backpack vão ser aleatórios e podem ser repitidos
    - Defina os itens dentro de config.itens separando por virgula
     
  16. Curtir
    gustavof deu reputação a xWhiteWolf em All bugs OTSERV - REVELADO ! -   
    testei todos os bugs ditos no tfs 1.2 q tem na otland e nenhum deles resultou em alguma coisa, quanto à deathlist do 8.6, eu já passei por isso e o problema é q quem fez o schema da database não tinha o mínimo conhecimento de banco de dados e fez uma baita gambiarra danada. A query da deathlist é outra gambiarra maior ainda e isso explica por si só o crash. A solução q eu encontrei foi refazer o script de deathlist usando uma query q eu confiasse.
    Quem tiver precisando só utilizar...
     
    SELECT player_id, date, level, all_kills.name FROM ( SELECT kill_id, name FROM player_killers INNER JOIN players ON player_id = id UNION SELECT * FROM environment_killers ) AS all_kills INNER JOIN player_deaths ON player_deaths.id = all_kills.kill_id WHERE player_id = 1-- pegar por script -- ORDER BY player_id, level DESC; se quiser só as ultimas 10 mortes tira o ; ali do fim e coloca embaixo
    LIMIT 10;

    Ps: aqui tem um print sem o limit mostrando que a query é rapida (testei num banco altamente populado)

    player_id é o id do char q eu quis verificar a deathlist, date é a data em unix time (os.time(), usando um os.date com esse numero vc retorna a data e hora em q ocorreu a morte) o level q ele estava e quem matou; Se não tiver "a ____" no all_kills.name então foi morte pra um player. 



    EDIT 2: Não usem cast system, saibam configurar maxpacket no config.lua (30~50), botem timeBetweenActions de 1 ou 2 segundos (1000 milisegundos no config.lua), constantemente chequem o git do forgotten server olhando os bugs, os commits e os prs, se possível se registre no git para receber notificações de tudo q rola por lá, duvido q seu server será explorado. Oque você não consegue resolver por source vc consegue resolver por script, então fiquem ligados e sempre testem tudo antes de abrir um sv só pra ganhar dinheiro. 
  17. Curtir
    gustavof deu reputação a Orochi Elf em [C++] doCreatureCastSpell(creature, spellName)   
    [C++] doCreatureCastSpell (0.3.6pl1)



    Escrito e testado: 0.3.6PL1 [8.54 - 8.60]




    Salve galera do TibiaKing, eu fui procurar na internet sobre essa função e vi que já tentaram cria-la, porém não conseguiram, ou se conseguiram nunca postaram. Então eu resolvi faze-la para vocês, e eu percebi que ninguém nunca tinha feito, por causa de uma dúvida, e um certo grau de dificuldade. Certamente, eu tive uma dificuldade no começo, porém ao desenvolver da função eu percebi que não era nada de mais.



    Então eu trago aqui pra vocês esta função, cuja a ideia é fazer com que a criatura (jogador ou monstro) a utilize uma magia pelo nome dela, importante lembrar que o nome da magia, não é as palavras mágicas, exemplo: "utani hur" é a palavra mágica e "haste" é o nome da magia. Enfim, sem mais delongas e vamos aos códigos





    Vá ao arquivo "LuaScript.cpp" e procure por:

    //doPlayerAddExperience(cid, amount) lua_register(m_luaState, "doPlayerAddExperience", LuaScriptInterface::luaDoPlayerAddExperience);


    E abaixo adicione:

    //doCreatureCastSpell // by OrochiElf. lua_register(m_luaState, "doCreatureCastSpell", LuaScriptInterface::luaDoCreatureCastSpell);


    Agora procure por:







    E abaixo adicione:

    int32_t LuaScriptInterface::luaDoCreatureCastSpell(lua_State* L) // by OrochiElf. { //doCreatureCastSpell(cid, spellname) std::string spellName = popString(L); ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) { InstantSpell* spell = g_spells->getInstantSpellByName(spellName); if(!spell) { lua_pushboolean(L, false); return 1; } Creature* target = creature->getAttackedCreature(); if(target) spell->castSpell(creature, target); else spell->castSpell(creature, creature); lua_pushboolean(L, true); } else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; }


    Agora vá ao arquivo "LuaScript.h" e procure por:

    static int32_t luaDoPlayerAddItem(lua_State* L);
    E abaixo adicione:
    static int32_t luaDoCreatureCastSpell(lua_State* L); // by OrochiElf


    Exemplo, eu tenho um pet, e quero que ele utilize a magia de "utani hur" - "haste".




    Talkaction Code:

    function onSay(cid, words, param, channel) local summon = getCreatureSummons(cid)[1] if isCreature(summon) then doCreatureCastSpell(summon, "haste") end return true end


    Esta função é muito requisitada para fazer servidores de pokémon, evitando gambiarras. Que foi o motivo para qual eu desenvolvi ela






    Créditos.



    Tony Araújo (OrochiElf) 100%

  18. Curtir
    gustavof deu reputação a Orochi Elf em [C++] Pokemon Ghost System   
    [C++] Pokemon Ghost System
     
    Fala galera do TibiaKing, hoje eu venho postar pra vocês um conteúdo que particularmente eu acho muito bom.
    Esse sistema faz com que o pokemon cuja o nome seja "Gastly, Haunter ou Gengar" (é possível adicionar mais pokemons), passe por dentro das paredes.
     
    Instalação:
    Vá em creature.cpp, e procure por

    void Creature::getPathSearchParams(const Creature* creature, FindPathParams& fpp) const {     fpp.fullPathSearch = !hasFollowPath;  
    E abaixo adicione:

    if(creature->isPlayerSummon()) {     if(!creature->getMaster()->hasCondition(CONDITION_INFIGHT))     {         if(creature->getName() == "Gengar")             fpp.clearSight = false;         if(creature->getName() == "Haunter")             fpp.clearSight = false;         if(creature->getName() == "Gastly")             fpp.clearSight = false;     } }  
     
    Espero que façam bom uso
     
    Créditos:
    Tony Araújo (OrochiElf)
  19. Curtir
    gustavof deu reputação a Noninhouh em Auto Walk System (!Walk)   
    Bom galera, hoje vim aqui trazer pra vocês um sisteminha bem legal que a PxG possui, no entanto, esse sistema eu fiz para um servidor de Tibia, então para vocês usarem em um derivado seria bom adapta-lo, devido a outros sistemas (como o fly do poketibia).
     
    Como seria esse sistema? Basicamente você digita o comando !walk e o seu personagem começará a andar na direção em que está virado até encontrar um obstáculo, ou até digitar o comando !walk novamente.
     
    Crie um arquivo chamado walk.lua em /data/talkactions/scripts/, e cole isso dentro:
     
    Em talkactions.xml coloque a tag:
    <talkaction words="!walk" event="script" value="walk.lua"/>  
    Em creaturescripts.xml, veja se já tem o evento "logout", caso não tenha coloque:
    <event type="logout" name="PlayerLogout" event="script" value="logout.lua"/>  
    Em /data/creaturescripts/scripts/, crie um arquivo chamando logout.lua (caso não tenha) e cole isso dentro:
     
  20. Curtir
    gustavof deu reputação a Vampira em [Tutorial] Criando quest log   
    *Criando quest log por Action*


    Como eu não achei nenhum tutorial desse por aqui resolvi criar um, neste tutorial ensinarei vocês a criar um quest log para suas quests

    Oque é quest log: Quest Log tem a função de armazenar as quests que você fez ou está fazendo, mostrar em que parte da QUEST você está e como seguir adiante, etc...

    Em data/XML abra o arquivo chamado quests.xml nele vai ter mais ou menos assim:


    Entendendo:

    Vermelho = Nome da sua Quest
    Verde = Storage ID da Quest que vai aparecer no Quest Log
    Azul = Numéro de Início da Quest
    Negrito = Nome da Missão
    Rosa = Storage da Missão
    Laranja = Valor de Início da Missão
    Marrom = Valor de Finalização
    Preto = Descrição da Missão

    Bom, agora que nós já entendemos o que cada coisa faz, podemos dar continuidade com o SCRIPT. aonde estáNome da Quest você deve colocar o Nome que vai aparecer no Quest Log, depois que você inseriu o nome da sua Quest você deve ir na pasta data/actions/scripts e achar o arquivo .lua da sua Quest, nele você apertaCTRL+F e depois digita isso aqui:


    Depois que você encontrar este comando clique em Cancelar, depois vai ter mais ou menos isso:

    Exemplo:


    Relembrando que a cor Verde é o nosso Storage ID e o Azul é o nosso Comando de Início

    Agora que nós achamos o nosso Storage ID e o nosso Comando de Início podemos preencher a primeira linha da nossa Quest assim:


    Explicando um pouco para poder continuarmos com nosso Tutorial, uma quest é composta de Storages Values, cada movimento que você avança em sua Quest é dado um Storage Value novo.

    EX: Você pega a Quest (Ganhou seu primeiro Storage Value), Você abriu o Baú (Ganhou seu Storage Value Final.). Isso quando você está fazendo a Quest por Action.

    Então nós entendemos que na primeira linha da Quest nós precisamos por o Value de quando você pega a Quest. Agora continuando com o SCRIPT...

    Nós vimos que o nosso Storage ID era 1 e o nosso Comando de Início era 1, então nós acabamos de preencher a primeira linha com os números que encontramos.

    Agora nós vamos para a segunda linha, primeiramente você deve colocar o nome da sua missão, dai você me pergunta:

    - Nós já não colocamos o nome da nossa Quest?
    Resposta: Sim, nós colocamos o NOME DA QUEST agora vamos colocar o NOME DA MISSÃO, ou seja, aqueles nomes que fica no retângulo de cima quando você da SHOW na QUEST, aquilo é uma Missão.

    Bom, depois que você colocou o Nome da sua Missão, como eu havia explicado antes sobre Storages Values, nós devemos pegar agora o nosso primeiro Storage Value novamente e o nosso primeiro Comando de início, ficando assim:


    Pronto, nós preenchemos o nosso StorageValue e o nosso Comando de Início agora nós precisamos inserir o valor de término, depois que você pega o Baú (como expliquei ali em cima) você recebe o seu segundo Storage Value digamos que o meu seja assim:


    Observe que o Storage Value de quando você pega o Baú tem 2 em vez de 1, isto porque o 2 é o número de encerramento da missão, então nós devemos colocar assim na segunda linha:


    Resumindo, a nossa missão começa logo quando você recebe a missão do NPC e ela se completa quando você abre o Baú. Agora que a parte mais difícil já foi, vamos para a parte mais fácil do nosso SCRIPT, a Descrição da missão (a frase que aparece no quadro de baixo).


    Esse
    é o número da descrição, no caso nós colocamos apenas uma Missão então seria uma Descrição, se você colocar 2 Missão, você vai colocar e na outra você vai colocar depois da nossa missionstate tudo que devemos fazer é colocar nossa descrição onde está "Descrição da Missão.", ficando assim:

    Lembrando que nunca se deve usar carácteres especiais, como:


    Terminamos aqui nosso tutorial espero que tenham gostado

    Creditos: meu
    Inspiração: joaovbz
  21. Obrigado
    gustavof recebeu reputação de Banker em [PxG] Texto de player   
    Fala galera, tudo certo?
    Então, a um tempo atras, criei um tópico aqui no fórum pedindo uma ajuda sobre como alterar algumas coisas dentro de um servidor de poketibia, porém, não encontrei a resposta.
    [Duvida] Cores de mensagem

     
    Depois de um longo tempo procurando as informações dentro da source do cliente, consegui finalmente resolver o meu problema e me senti com uma divida no fórum, graças ao @Brunds que mesmo não resolvendo o meu problema, estava respondendo as minhas mensagens. Com isso venho compartilhar a minha solução.
    Servidor utilizado para base: [DxP] Exclusivo Poketibia OpenSource+Cliente+Site+DB
    Musica utilizada: Tech N9ne - Come Gangsta (Izzamuzzic Remix)
     
    Tutorial Como alterar a cor do texto
    Antes de encontrar a solução, tentei criar um novo tipo de talktype, estava conseguindo, o servidor estava enviando as mensagens corretamente, mas o problema estava no cliente, então mudei a estrategia e tentei usar o que já estava funcionando, lembrei que atualmente existe dois tipo de monster talktype:
    data/lib/000-constant.lua
    TALKTYPE_MONSTER = 19 TALKTYPE_MONSTER_YELL = 20 O talktype 19 é usado normalmente para os monstros "falarem" e o outro valor não estava sendo usando, pensando nisso peguei esse valor para a minha função de texto.
     
    Obs.: Não vou ensinar como compilar o cliente - Compilando OTC - CodeBlocks - Windows - Vídeo Aula
     
    Primeiro passo
    Alterei a linha 142
    otclient/source/client/statictext.cpp
    } else if(m_mode == Otc::MessageMonsterSay || m_mode == Otc::MessageSpell || m_mode == Otc::MessageBarkLow || m_mode == Otc::MessageBarkLoud) { m_color = Color(254, 101, 0); } else if(m_mode == Otc::MessageMonsterYell ){ m_color = Color(255,165,0); } Com isso, estou definindo em m_color que, quando o valor de m_mode for igual a MessageMonsterYell, m_color receba a cor especificada em RGB. Alterando isso eu já consigo modificar a cor, porem, ainda não tem um limite de mensagens que aparecem quando  o player "fala", continue pesquisando e encontrei uma "meia" solução, adaptei e consegui o resultado que eu estava buscando.
    Dentro do mesmo arquivo.
    Alterei a linha 74
    else if(m_name != name || m_mode != mode) { return false; } else if(mode == Otc::MessageMonsterYell){ if(m_messages.size() > 2) { m_messages.pop_front(); m_updateEvent->cancel(); m_updateEvent = nullptr; } } // too many messages else if(m_messages.size() > 10) { m_messages.pop_front(); m_updateEvent->cancel(); m_updateEvent = nullptr; } Adicionei um else if para o mode de MessageMonsterYell, que é o valor estamos utilizando para a comunicação do player, verificando a quantidade de mensagens e limitando em até 3 mensagens.
    Apos essas alterações, basta apenas compilar o cliente, porem, ainda não esta pronto .
     
    Segundo passo
    Agora precisamos alterar o script do nosso servidor para "falar" da maneira correta, pois atualmente o player envia mensagens ao cliente com outro valor, vamos alterar.
    Lembrando dos valores que estão definidos no data/lib/000-constant.lua  existe outro dois valores para representar a mesma coisa, porem, apenas com o nome diferente, acredito eu que é para facilitar, dentro do arquivo data/lib/100-compat.lua
    TALKTYPE_ORANGE_1 = TALKTYPE_MONSTER TALKTYPE_ORANGE_2 = TALKTYPE_MONSTER_YELL Não muda nada, apenas o nome da "variavel".
     
    Alterei a linha 39
    data/lib/120-goback.lua
    doCreatureSay(cid, mbk, TALKTYPE_ORANGE_2) Alterei a linha 228
    data/actions/scripts/Basic/goback.lua
    doCreatureSay(cid, mgo, TALKTYPE_ORANGE_2) Alterei as linhas:
    22, 69, 83, 85, 107, 186, 204, 222, 241, 248, 258, 263
    data/actions/scripts/Basic/order.lua
    -- linha 22 doPlayerSay(cid, getCreatureNick(getCreatureSummons(cid)[1]) .. orderTalks["downability"].talks[math.random(#orderTalks["downability"].talks)], TALKTYPE_ORANGE_2) -- linha 69 doPlayerSay(cid, pokeName..orderTalks["ride"].talks[math.random(#orderTalks["ride"].talks)], TALKTYPE_ORANGE_2) -- linhas 83 e 85 if string.find(habilidades, "levitate") then doPlayerSay(cid, pokeName..orderTalks["levitate"].talks[math.random(#orderTalks["levitate"].talks)], TALKTYPE_ORANGE_2) else doPlayerSay(cid, pokeName..orderTalks["fly"].talks[math.random(#orderTalks["fly"].talks)], TALKTYPE_ORANGE_2) end -- linha 107 doPlayerSay(cid, getCreatureNick(getCreatureSummons(cid)[1])..", reverta-se.", TALKTYPE_ORANGE_2) -- linha 186 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["dig"].talks[math.random(#orderTalks["dig"].talks)], TALKTYPE_ORANGE_2) -- linha 204 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["cut"].talks[math.random(#orderTalks["cut"].talks)], TALKTYPE_ORANGE_2) -- linha 222 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["rock"].talks[math.random(#orderTalks["rock"].talks)], TALKTYPE_ORANGE_2) -- linha 241 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["headbutt"].talks[math.random(#orderTalks["headbutt"].talks)], TALKTYPE_ORANGE_2) -- linha 248 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["move"].talks[math.random(#orderTalks["move"].talks)], TALKTYPE_ORANGE_2) -- linha 258 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["move"].talks[math.random(#orderTalks["move"].talks)], TALKTYPE_ORANGE_2) -- linha 263 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["move"].talks[math.random(#orderTalks["move"].talks)], TALKTYPE_ORANGE_2)  
    Apos esse processo todo, salva e abre o serve.
     
    Créditos
    @Banker
    @Brunds
    kyogron -- outro forum
    Me
     
    Obs.: Aceito pagamento no PicPay para aula de programação
    Obs.2: Não sou bom professor
    Obs.3: Ajuda a comprar um Mc Lanche Feliz
  22. Curtir
    gustavof recebeu reputação de Gabrieltxu em [PxG] Texto de player   
    Fala galera, tudo certo?
    Então, a um tempo atras, criei um tópico aqui no fórum pedindo uma ajuda sobre como alterar algumas coisas dentro de um servidor de poketibia, porém, não encontrei a resposta.
    [Duvida] Cores de mensagem

     
    Depois de um longo tempo procurando as informações dentro da source do cliente, consegui finalmente resolver o meu problema e me senti com uma divida no fórum, graças ao @Brunds que mesmo não resolvendo o meu problema, estava respondendo as minhas mensagens. Com isso venho compartilhar a minha solução.
    Servidor utilizado para base: [DxP] Exclusivo Poketibia OpenSource+Cliente+Site+DB
    Musica utilizada: Tech N9ne - Come Gangsta (Izzamuzzic Remix)
     
    Tutorial Como alterar a cor do texto
    Antes de encontrar a solução, tentei criar um novo tipo de talktype, estava conseguindo, o servidor estava enviando as mensagens corretamente, mas o problema estava no cliente, então mudei a estrategia e tentei usar o que já estava funcionando, lembrei que atualmente existe dois tipo de monster talktype:
    data/lib/000-constant.lua
    TALKTYPE_MONSTER = 19 TALKTYPE_MONSTER_YELL = 20 O talktype 19 é usado normalmente para os monstros "falarem" e o outro valor não estava sendo usando, pensando nisso peguei esse valor para a minha função de texto.
     
    Obs.: Não vou ensinar como compilar o cliente - Compilando OTC - CodeBlocks - Windows - Vídeo Aula
     
    Primeiro passo
    Alterei a linha 142
    otclient/source/client/statictext.cpp
    } else if(m_mode == Otc::MessageMonsterSay || m_mode == Otc::MessageSpell || m_mode == Otc::MessageBarkLow || m_mode == Otc::MessageBarkLoud) { m_color = Color(254, 101, 0); } else if(m_mode == Otc::MessageMonsterYell ){ m_color = Color(255,165,0); } Com isso, estou definindo em m_color que, quando o valor de m_mode for igual a MessageMonsterYell, m_color receba a cor especificada em RGB. Alterando isso eu já consigo modificar a cor, porem, ainda não tem um limite de mensagens que aparecem quando  o player "fala", continue pesquisando e encontrei uma "meia" solução, adaptei e consegui o resultado que eu estava buscando.
    Dentro do mesmo arquivo.
    Alterei a linha 74
    else if(m_name != name || m_mode != mode) { return false; } else if(mode == Otc::MessageMonsterYell){ if(m_messages.size() > 2) { m_messages.pop_front(); m_updateEvent->cancel(); m_updateEvent = nullptr; } } // too many messages else if(m_messages.size() > 10) { m_messages.pop_front(); m_updateEvent->cancel(); m_updateEvent = nullptr; } Adicionei um else if para o mode de MessageMonsterYell, que é o valor estamos utilizando para a comunicação do player, verificando a quantidade de mensagens e limitando em até 3 mensagens.
    Apos essas alterações, basta apenas compilar o cliente, porem, ainda não esta pronto .
     
    Segundo passo
    Agora precisamos alterar o script do nosso servidor para "falar" da maneira correta, pois atualmente o player envia mensagens ao cliente com outro valor, vamos alterar.
    Lembrando dos valores que estão definidos no data/lib/000-constant.lua  existe outro dois valores para representar a mesma coisa, porem, apenas com o nome diferente, acredito eu que é para facilitar, dentro do arquivo data/lib/100-compat.lua
    TALKTYPE_ORANGE_1 = TALKTYPE_MONSTER TALKTYPE_ORANGE_2 = TALKTYPE_MONSTER_YELL Não muda nada, apenas o nome da "variavel".
     
    Alterei a linha 39
    data/lib/120-goback.lua
    doCreatureSay(cid, mbk, TALKTYPE_ORANGE_2) Alterei a linha 228
    data/actions/scripts/Basic/goback.lua
    doCreatureSay(cid, mgo, TALKTYPE_ORANGE_2) Alterei as linhas:
    22, 69, 83, 85, 107, 186, 204, 222, 241, 248, 258, 263
    data/actions/scripts/Basic/order.lua
    -- linha 22 doPlayerSay(cid, getCreatureNick(getCreatureSummons(cid)[1]) .. orderTalks["downability"].talks[math.random(#orderTalks["downability"].talks)], TALKTYPE_ORANGE_2) -- linha 69 doPlayerSay(cid, pokeName..orderTalks["ride"].talks[math.random(#orderTalks["ride"].talks)], TALKTYPE_ORANGE_2) -- linhas 83 e 85 if string.find(habilidades, "levitate") then doPlayerSay(cid, pokeName..orderTalks["levitate"].talks[math.random(#orderTalks["levitate"].talks)], TALKTYPE_ORANGE_2) else doPlayerSay(cid, pokeName..orderTalks["fly"].talks[math.random(#orderTalks["fly"].talks)], TALKTYPE_ORANGE_2) end -- linha 107 doPlayerSay(cid, getCreatureNick(getCreatureSummons(cid)[1])..", reverta-se.", TALKTYPE_ORANGE_2) -- linha 186 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["dig"].talks[math.random(#orderTalks["dig"].talks)], TALKTYPE_ORANGE_2) -- linha 204 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["cut"].talks[math.random(#orderTalks["cut"].talks)], TALKTYPE_ORANGE_2) -- linha 222 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["rock"].talks[math.random(#orderTalks["rock"].talks)], TALKTYPE_ORANGE_2) -- linha 241 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["headbutt"].talks[math.random(#orderTalks["headbutt"].talks)], TALKTYPE_ORANGE_2) -- linha 248 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["move"].talks[math.random(#orderTalks["move"].talks)], TALKTYPE_ORANGE_2) -- linha 258 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["move"].talks[math.random(#orderTalks["move"].talks)], TALKTYPE_ORANGE_2) -- linha 263 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["move"].talks[math.random(#orderTalks["move"].talks)], TALKTYPE_ORANGE_2)  
    Apos esse processo todo, salva e abre o serve.
     
    Créditos
    @Banker
    @Brunds
    kyogron -- outro forum
    Me
     
    Obs.: Aceito pagamento no PicPay para aula de programação
    Obs.2: Não sou bom professor
    Obs.3: Ajuda a comprar um Mc Lanche Feliz
  23. Obrigado
    gustavof recebeu reputação de KotZletY em [PxG] Texto de player   
    Fala galera, tudo certo?
    Então, a um tempo atras, criei um tópico aqui no fórum pedindo uma ajuda sobre como alterar algumas coisas dentro de um servidor de poketibia, porém, não encontrei a resposta.
    [Duvida] Cores de mensagem

     
    Depois de um longo tempo procurando as informações dentro da source do cliente, consegui finalmente resolver o meu problema e me senti com uma divida no fórum, graças ao @Brunds que mesmo não resolvendo o meu problema, estava respondendo as minhas mensagens. Com isso venho compartilhar a minha solução.
    Servidor utilizado para base: [DxP] Exclusivo Poketibia OpenSource+Cliente+Site+DB
    Musica utilizada: Tech N9ne - Come Gangsta (Izzamuzzic Remix)
     
    Tutorial Como alterar a cor do texto
    Antes de encontrar a solução, tentei criar um novo tipo de talktype, estava conseguindo, o servidor estava enviando as mensagens corretamente, mas o problema estava no cliente, então mudei a estrategia e tentei usar o que já estava funcionando, lembrei que atualmente existe dois tipo de monster talktype:
    data/lib/000-constant.lua
    TALKTYPE_MONSTER = 19 TALKTYPE_MONSTER_YELL = 20 O talktype 19 é usado normalmente para os monstros "falarem" e o outro valor não estava sendo usando, pensando nisso peguei esse valor para a minha função de texto.
     
    Obs.: Não vou ensinar como compilar o cliente - Compilando OTC - CodeBlocks - Windows - Vídeo Aula
     
    Primeiro passo
    Alterei a linha 142
    otclient/source/client/statictext.cpp
    } else if(m_mode == Otc::MessageMonsterSay || m_mode == Otc::MessageSpell || m_mode == Otc::MessageBarkLow || m_mode == Otc::MessageBarkLoud) { m_color = Color(254, 101, 0); } else if(m_mode == Otc::MessageMonsterYell ){ m_color = Color(255,165,0); } Com isso, estou definindo em m_color que, quando o valor de m_mode for igual a MessageMonsterYell, m_color receba a cor especificada em RGB. Alterando isso eu já consigo modificar a cor, porem, ainda não tem um limite de mensagens que aparecem quando  o player "fala", continue pesquisando e encontrei uma "meia" solução, adaptei e consegui o resultado que eu estava buscando.
    Dentro do mesmo arquivo.
    Alterei a linha 74
    else if(m_name != name || m_mode != mode) { return false; } else if(mode == Otc::MessageMonsterYell){ if(m_messages.size() > 2) { m_messages.pop_front(); m_updateEvent->cancel(); m_updateEvent = nullptr; } } // too many messages else if(m_messages.size() > 10) { m_messages.pop_front(); m_updateEvent->cancel(); m_updateEvent = nullptr; } Adicionei um else if para o mode de MessageMonsterYell, que é o valor estamos utilizando para a comunicação do player, verificando a quantidade de mensagens e limitando em até 3 mensagens.
    Apos essas alterações, basta apenas compilar o cliente, porem, ainda não esta pronto .
     
    Segundo passo
    Agora precisamos alterar o script do nosso servidor para "falar" da maneira correta, pois atualmente o player envia mensagens ao cliente com outro valor, vamos alterar.
    Lembrando dos valores que estão definidos no data/lib/000-constant.lua  existe outro dois valores para representar a mesma coisa, porem, apenas com o nome diferente, acredito eu que é para facilitar, dentro do arquivo data/lib/100-compat.lua
    TALKTYPE_ORANGE_1 = TALKTYPE_MONSTER TALKTYPE_ORANGE_2 = TALKTYPE_MONSTER_YELL Não muda nada, apenas o nome da "variavel".
     
    Alterei a linha 39
    data/lib/120-goback.lua
    doCreatureSay(cid, mbk, TALKTYPE_ORANGE_2) Alterei a linha 228
    data/actions/scripts/Basic/goback.lua
    doCreatureSay(cid, mgo, TALKTYPE_ORANGE_2) Alterei as linhas:
    22, 69, 83, 85, 107, 186, 204, 222, 241, 248, 258, 263
    data/actions/scripts/Basic/order.lua
    -- linha 22 doPlayerSay(cid, getCreatureNick(getCreatureSummons(cid)[1]) .. orderTalks["downability"].talks[math.random(#orderTalks["downability"].talks)], TALKTYPE_ORANGE_2) -- linha 69 doPlayerSay(cid, pokeName..orderTalks["ride"].talks[math.random(#orderTalks["ride"].talks)], TALKTYPE_ORANGE_2) -- linhas 83 e 85 if string.find(habilidades, "levitate") then doPlayerSay(cid, pokeName..orderTalks["levitate"].talks[math.random(#orderTalks["levitate"].talks)], TALKTYPE_ORANGE_2) else doPlayerSay(cid, pokeName..orderTalks["fly"].talks[math.random(#orderTalks["fly"].talks)], TALKTYPE_ORANGE_2) end -- linha 107 doPlayerSay(cid, getCreatureNick(getCreatureSummons(cid)[1])..", reverta-se.", TALKTYPE_ORANGE_2) -- linha 186 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["dig"].talks[math.random(#orderTalks["dig"].talks)], TALKTYPE_ORANGE_2) -- linha 204 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["cut"].talks[math.random(#orderTalks["cut"].talks)], TALKTYPE_ORANGE_2) -- linha 222 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["rock"].talks[math.random(#orderTalks["rock"].talks)], TALKTYPE_ORANGE_2) -- linha 241 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["headbutt"].talks[math.random(#orderTalks["headbutt"].talks)], TALKTYPE_ORANGE_2) -- linha 248 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["move"].talks[math.random(#orderTalks["move"].talks)], TALKTYPE_ORANGE_2) -- linha 258 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["move"].talks[math.random(#orderTalks["move"].talks)], TALKTYPE_ORANGE_2) -- linha 263 doPlayerSay(cid, getCreatureNick(poke)..orderTalks["move"].talks[math.random(#orderTalks["move"].talks)], TALKTYPE_ORANGE_2)  
    Apos esse processo todo, salva e abre o serve.
     
    Créditos
    @Banker
    @Brunds
    kyogron -- outro forum
    Me
     
    Obs.: Aceito pagamento no PicPay para aula de programação
    Obs.2: Não sou bom professor
    Obs.3: Ajuda a comprar um Mc Lanche Feliz
  24. Obrigado
    gustavof deu reputação a Banker em Compilando OTC - CodeBlocks - Windows - Vídeo Aula   
    Tutorial, ensinando à compilar as sources do OTC de qualquer versão utilizando codeblocks no windows, à pedido de um amigo!
     
     
     
    LINKS:
     
    MinGW - https://sourceforge.net/projects/mingw/files/
    CMake - https://cmake.org/download/
    CodeBlocks - http://www.codeblocks.org/downloads/26
    Libs MinGW32 - http://www.mediafire.com/file/gf1cr1rj0znxdan/otclient-libs-mingw32.rar
    MinGW c/Libs - https://mega.nz/#!6AtwEJpB!UO4vyzuXYTe8Fw5jaAzA3fg9XKZ4aIngeYqAG0Rv9kM
    Source OTC 0.6.5 - https://codeload.github.com/edubart/otclient/zip/v0.6.5
    Source OTC 0.6.6 - https://codeload.github.com/edubart/otclient/zip/v0.6.6
    Source OTC 0.6.7 - http://www.tibiaking.com/forum/forums/topic/34344-otclient-067-1071/
    Versão Mais Atualizada(Last Release) - https://github.com/edubart/otclient/archive/master.zip
     
    GitHub - https://github.com/edubart/otclient/
    Tópico  - http://www.tibiaking.com/forum/forums/topic/43700-otc-compilando-otclient-no-windows/
     
    Scans:
    https://www.virustotal.com/#/file/2281f14503ea910f93cbc4a29d21326c5ee55c7380659082ae3a16c896ac100f/detection
    https://www.virustotal.com/#/file/e4ed1666b44c63d3603a74e7e101a1af80eff79993e5a7642f4149f71b7edc9d/detection
    https://www.virustotal.com/#/file/aab27bd5547d35dc159288f3b5b8760f21b0cfec86e8f0032b49dd0410f232bc/detection
     
     
    Créditos:
    EduBart - Sources do OTClient
    Kyogron - MinGW c/ Libs
    Wend - Tutorial / Tópico no TK
    Avuenja - Tópico das Sources 0.6.7
    Eu(Banker) - Vídeo-Tutorial
  25. Gostei
    gustavof deu reputação a Thayam em [TUTORIAL] Quando preocupar-se com as cores? - Spriting   
    Falae pessoal do TK!
    Hoje to a milhão e vim trazer mais um tutorial para os spriters de plantão! haha
     
    Vamos lá:
     
    Quando eu devo me preocupar com cores?

    Bem, essencialmente o que vem é, que cores a peça precisa ter? Então, enquanto eu prossigo, o quão longe eu posso ir com estas (até é claro eu precisar adicionar mais sombras). Aí é quando a mistura ocorre.
    -Adarias

    Esse é um método comum de criação de paleta para uma peça. Aqui vai um exemplo do que ele está falando:



    Como a peça se torna mais complexa, torna-se necessária a criação de cores adicionais para alcançar o sombreamento mais avançado, ou para colorir novos elementos da imagem ou detalhes.

    Outro método consiste em criar a peça em tons de cinza, e adicionar cor posteriormente. Isto é possível porque um valor relativo é uma preocupação maior do que com o tom, porque o tom pode ser mais facilmente alterado mais tarde, após as relações de valor serem estabelecidas.



    Pessoalmente eu acho mais fácil de acompanhar cores enquanto a peça avança, por isso eu prefiro o primeiro método.




    Contagem de cores

    Você deve achar que pixel artistas muitas vezes defendem uma contagem baixa de cor. Você deve assumir que isso é uma tradição de dias velhos de pixel art deixada para trás, quando os consoles de vídeo game só podiam disponibilizar certa quantidade de cores.



    Se os computadores modernos podem facilmente exibir centenas de cores, por que você não deve usar todas elas? Na verdade, usar paletas pequenas não é uma tradição ultrapassada do pixel art, e há razões muito lógicas por trás desta prática.

    Coesão - Quando você estiver usando menos cores, as mesmas cores reaparecerão por toda a peça com mais frequência. Uma vez que diferentes áreas do trabalho compartilham as mesmas cores, a paleta envolve as peças, unificando o trabalho.

    Controle - Quanto menor a paleta, mais fácil de gerir. Você pode, e provavelmente irá, querer ajustar uma cor mais tarde. Se você tem 200 cores, vai levar muito mais tempo para fazer os ajustes, porque por mudar uma cor você muda toda a relação dessa cor com as cores vizinhas na sua paleta, e ajustá-la significa mudar as relações entre as cores e seus vizinhos! Você pode ver como isso rapidamente acrescenta-se a um monte de trabalho. Com uma pequena paleta, o efeito de mudar uma única cor é mais substancial, e existe menos micro relações a se preocupar.




    Tom, saturação e luminosidade

    Tom:
    O Tom refere-se à identidade de uma cor. Se uma cor é definida como azul, vermelho, laranja, etc. Depende da sua tonalidade:



    Na foto acima, o tom é representado ao longo do eixo-x.

    Assim como você pode mudar a forma de como clara ou escura uma cor aparece por rodeá-la com pixels claros ou escuros, o tom percebido de uma cor depende do seu ambiente. Aqui temos um cinza completamente neutro, médio:



    Nesta foto (um detalhe desta peça por iLKke) o verde nas árvores não é realmente verde em si, mas o mesmo cinza da imagem anterior:



    Porque o fundo é tão roxo (que é o oposto do verde na roda de cores), o cinza parece mais verde do que realmente é.

    O tom será um conceito importante depois, quando falarmos de hue -shifting.

    Saturação:

    A saturação é a intensidade de uma cor. Quanto menor a saturação, mais próximo fica a cor do cinza:



    O problema mais comum que novos artistas encontram se refere à saturação. É o uso de cores muito saturadas. Quando isso acontece, as cores começam a queimar os olhos. Este pode ser um problema em qualquer mídia, mas porque as cores em pixel art são feitas de luz, ao invés de pigmento como na pintura, o potencial para cores serem muito claras ou irritantes é muito maior. Observe como as cores na segunda imagem são muito mais fáceis para os olhos:



    Luminosidade (brilho):

    Luminosidade (também conhecida como brilho ou valor) é o quanto mais clara ou mais escura é uma cor. Quanto maior a luminosidade, mais perto fica a cor do branco. Se a luminosidade é 0, então a cor é preta.
    Aqui está uma paleta organizada como uma escala de luminosidade para sua aprendizagem visual:


    Luminosidade baixa (cores mais escuras)na esquerda, alta (cores mais brilhantes) na direita

    Em uma dada paleta, você vai querer ter uma ampla gama de valores. Se você só tem cores no mesmo intervalo de luminosidade, então você não será capaz de criar bom contraste. Uma gama completa de valores permite que você use destaques, meios-tons e sombras. A diferença entre o brilho de duas cores é conhecido como contraste. Um problema comum em artistas recentes é não ter contraste suficiente. Aqui está um exemplo de uma imagem que o contraste é muito baixo:



    E essa mesma imagem, ajustada. Logo, os valores estão espalhados de forma mais uniforme do claro para o escuro:



    O valor de uma cor é um número definido, mas as cores podem parecer mais claras ou mais escuras dependendo do seu plano de fundo. Por esta razão, você não vai sempre querer usar sua cor mais brilhante para toda parte iluminada. Uma cor que faz um bom destaque em um objeto pode ser muito brilhante para uso em um objeto mais escuro.

    Luminosidade é especialmente relevante para pixel art: O brilho de um pixel ou linha determina o quanto grosso ele aparece:



    O primeiro exemplo é uma simples linha preta. A largura da linha parece consistente. Abaixo disso é uma linha com pixels que variam de brilho. Observe como a linha aparece mais fina no centro em 1x.

    Rampas de cores

    A rampa de cores é um grupo de cores que podem ser utilizadas em conjunto, organizadas de acordo com a luminosidade. Uma paleta pode consistir de uma rampa única com muitas rampas diferentes.

    Aqui está uma paleta:



    E aqui está essa mesma paleta, organizada de acordo com as rampas de sua cor (as quais existem duas):



    Não é necessário que você crie um modelo como o descrito acima (embora alguns artistas acharem útil). O que é importante é que você entenda quais as relações de suas cores, isto é, o que suas rampas são.

    Não é necessário que uma cor se restrinja a uma só rampa. Muitas vezes, rampas irão compartilhar cores. Frequentemente, a cor mais escura ou mais clara irá pertencer à maioria ou a todas as rampas da paleta, como no exemplo acima, em que ambas as rampas partilham os mesmos tons mais escuro e mais claro.

    Também é possível meios-tons trabalharem em rampas múltiplas. Nestes casos, a cor versátil toma o lugar de duas ou mais cores diferentes, auxiliando na conservação da paleta. No caso da rampa de multi-sombras e luzes, os extremos na luminescência permitem a cor a ser flexível (porque eles se aproximam do preto ou branco). Desde que os meios-tons não têm esta vantagem, eles muitas vezes são as cores mais neutras, o que significa que estão mais perto de marrom ou cinza.

    Aqui está uma paleta que usa um tom de cinza para unir as lacunas em várias rampas:



    Você também tem que ser cuidadoso sobre ter cores em uma rampa que não se encaixam. Se uma cor não pertence à rampa, então ele tem o potencial de perfurar a imagem, que é um erro grave em que a cor, ao invés de trabalhar como parte da imagem, parece separar-se dela, e parece quase que ela está sentada em cima da imagem. Isto é geralmente devido à saturação muito alta, ou pelos confrontos de tons com tons vizinhos, assim criando um eyeburn.


    A imagem acima mostra um eyeburn criado por uma cor com saturação muito alta.


    ... e nesta imagem, o eyeburn é criado pelo confronto do verde com o roxo. A tonalidade deve logicamente seguir os seus vizinhos na rampa.


    Hue shifting

    “Hue Shifting" se refere a transição de cores numa paleta. Uma paleta sem hue shifting é conhecida como "paleta reta". Nas paletas retas, só a luminosidade muda, enquanto em "paletas com hue shifting", o tom e a luminosidade mudam.





    A primeira paleta é uma paleta reta verde. A segunda imagem é uma paleta verde com hue shifting aplicado. Ao usar hue shifting, una seus destaques a uma determinada cor (amarelo, no exemplo acima), e mova as cores mais escuras em direção a uma segunda cor (eu escolhi azul no exemplo acima). O hue shifting é usado porque rampas retas são entediantes e não refletem a variedade de cores que nos vemos na realidade, e o hue shifting pode adicionar o contraste de cores sutis dentro de uma rampa.
     
    Ta ai pessoal, mais um tutorial muito bom sobre cores em sua pixel art, espero que gostem e que tirem muito proveito deste tópico haha
     
    Obrigado pela atenção e até o próximo tutorial
     
    Créditos:
    Pixelaria (tutorial)
    Thayam (trazer para o TK)
     

Informação Importante

Confirmação de Termo