Histórico de Curtidas
-
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.
-
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. -
gustavof deu reputação a Leohige em The Ruby Server - Base Pokémon TFS 1.2 - 9.80The 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
-
gustavof deu reputação a Martim Tiburcio em Seu Último TrabalhoPraticando,
-
gustavof deu reputação a Spriter Draiman em Seu Último TrabalhoVamo dar uma reanimada nisto daqui..
-
gustavof deu reputação a peonso666 em OpenTibia Sprite PackOpenTibia 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
-
gustavof deu reputação a goldentivit em [Pedido] Sprite de EspadaNão ficou a melhor coisa do mundo, mas acho que pode quebrar o galho enquanto alguém não manda uma boa
-
gustavof recebeu reputação de jeffersonxvr em Mover item entre slotsQual 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?
-
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!
-
gustavof deu reputação a Dwarfer em (Resolvido)Script Inteligente de Invasão para EventoSegue 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.
-
gustavof deu reputação a Rusherzin em Função print_rNos ú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:
-
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
-
gustavof recebeu reputação de KotZletY em (Resolvido)[Pedido] Cassino MachineModifiquei 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
-
gustavof deu reputação a OfWar em (Resolvido)[Pedido] Cassino MachineBoa 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
-
gustavof recebeu reputação de OfWar em (Resolvido)[Pedido] Cassino MachineModifiquei 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
-
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.
-
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%
-
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)
-
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:
-
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
-
gustavof recebeu reputação de Banker em [PxG] Texto de playerFala 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
-
gustavof recebeu reputação de Gabrieltxu em [PxG] Texto de playerFala 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
-
gustavof recebeu reputação de KotZletY em [PxG] Texto de playerFala 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
-
gustavof deu reputação a Banker em Compilando OTC - CodeBlocks - Windows - Vídeo AulaTutorial, 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
-
gustavof deu reputação a Thayam em [TUTORIAL] Quando preocupar-se com as cores? - SpritingFalae 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)