Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

Faz tempo que não posto nada, então deu vontade, tava brincando um pouco ai fiz esse sisteminha básico.

 

• Gifs

 

Nesse primeiro Gif, ao trocar a direção da Outfit, o nome e as barras de informações como Health, Mana, mudam de posição, isso é bom para ajustar as Outfits de acordo com o seu tamanho, como o Demon, ficar com as informações logo em cima da cabeça, ou Hydra, todos estão com o local padrão.

VFC4Lh2.gif

 

Aqui era como as informações ficavam com essa Outfit originalmente, no padrão de sempre dos clients.

CVrgAOY.gif

 

 

Comparativo em imagem estática:

 

Tibia Outfit antes e depois:

ucM5tOx.png

 

Aqui estão algumas outfits que meu primo @Fae1z fez, apliquei o sistema de offset nelas, uma do Graves, uma do Ekko, ambos são personagens do game League of Legends, e uma baseada Uganda Knuckle:

 

Ekko antes:

858w3br.png

 

Ekko depois:

PpFY4nW.png

 

Graves antes e depois:

sWUy8m5.png

 

Uganda Knuckle antes e depois:

LMGYSXp.png

 

Aqui eu estava brincando de por as informações da Outfit de anão de modo drogado kkk.

7YidTbN.gif

 

 

• Código

 

Em Creature.h modifique nesta linha:

void Creature::drawInformation(const Point& point, bool useGray, const Rect& parentRect, int drawFlags)

Mude "const Point& point" para "Point& point".

Ficando:

void Creature::drawInformation(Point& point, bool useGray, const Rect& parentRect, int drawFlags)

 

Embaixo de:
 

std::string getName() { return m_name; }

Adicione:
 

Point getInformationOffset() { return m_informationOffset; }
void setInformationOffset(int x, int y) {
    m_informationOffset.x = x;
    m_informationOffset.y = y;
}

 

Embaixo de:

Position m_oldPosition;

Adicione:

 

Point m_informationOffset;

 

 

Agora, em Creature.cpp procure por:

void Creature::drawInformation(const Point& point, bool useGray, const Rect& parentRect, int drawFlags)

Mude "const Point& point" para "Point& point".

Ficando:

void Creature::drawInformation(Point& point, bool useGray, const Rect& parentRect, int drawFlags)

Sim, isso está repetido, é assim mesmo, o processo é necessário em Creature.h e Creature.cpp, nessa função a variável point tem seu tipo alterado de Const para normal.

 

Ainda em Creature.cpp procure por:

if(!useGray)
    fillColor = m_informationColor;

Pule duas linhas e adicione:

    point.x += m_informationOffset.x;
    point.y += m_informationOffset.y;

 

Agora, em Luafunctions.cpp procure por:

g_lua.bindClassMemberFunction<Creature>("jump", &Creature::jump);

Embaixo adicione:

    g_lua.bindClassMemberFunction<Creature>("setInformationOffset", &Creature::setInformationOffset);
    g_lua.bindClassMemberFunction<Creature>("getInformationOffset", &Creature::getInformationOffset);

 

A parte da source é só isso.

 

Foi criada uma variável do tipo Point na classe Creature, que pode armazenar dois valores do tipo Int, sendo eles X & Y, assim detendo uma posição de offset, para ajustar a posição das informações(Health Bar, Mana Bar e Name) da criatura, essa variável é usada na função Creature::drawInformation, onde ocorre todo o desenho de informações das criaturas, lá o offset criado altera a posição de um Point usado como posição base das informações, alterando esse Point todo o resto segue aquela posição,  você pode setar o offset diretamente na criatura, as funções podem ser usadas tanto na source usando C++ quanto nos scripts usando Lua, em Lua o uso das funções é o seguinte:

 

Essa função retorna uma tabela com X & Y, algo como "table = {x = 10, y = 20}", são as posições do offset.

Creature:getInformationOffset()

Exemplo de uso:

 

local Offset = Creature:getInformationOffset()

print(Offset.x)
print(Offset.y)

Isso vai printar no client_terminal do OTClient os valores de X & Y.

 

Enquanto esta altera as posições usando os valores & Y.

Creature:setInformationOffset(x, y)

Exemplo:

Creature:setInformationOffset(10, -5)

 

Essa configuração de offset vai aumentar em 10 Pixels e diminuir em 5 Pixels, no meu primeiro gif, na direção Sul do Char, eu usei diminuindo 13 PixelsY diminuindo 8 Pixels, algo como isso:

Creature:setInformationOffset(-13, -8)

 

 

Para tudo isso funcionar igual os gifs acima eu fiz um módulo especial, onde dependendo da Outfit e da direção que a criatura está olhando, ele vai alterar o offset de acordo.

 

Para criar o módulo, siga estes passos:

 

Na pasta do OTClient em modules/ crie uma pasta chamada game_creatureinformation, dentro crie um arquivo com o mesmo nome e a extensão .otmod, algo como "game_creatureinformation.otmod", o conteúdo do arquivo é este:

Module
  name: game_creatureinformation
  description: Changes the position of the informations point to correctly draw names and creature bars.
  author: Snowsz
  website: tibiaking.com
  autoload: true
  reloadable: true
  sandboxed: true
  version: 1.0
  scripts: [ game_creatureinformation ]
  @onLoad: init()
  @onUnload: terminate()

 

Crie um arquivo com o mesmo nome e a extensão .lua, algo como "game_creatureinformation.lua", o conteúdo do arquivo é este:

--[[
    Directions:

    North /\
    East >
    South \/
    West <


    Structure:
    [OutfitID] = {
        [Direction] = {x = OFFSETX, y = OFFSETY},
    }
]]

--Lista de offsets para cada Outfit.
local OutfitOffsets = {
    [143] = { --Outfit do primeiro gif
        [North] = {x = -13, y = -8},
        [East] = {x = -17, y = -8},
        [South] = {x = -13, y = -8},
        [West] = {x = -15, y = -8},
    },
    [160] = { --Outfit de anão com o nome full drogado.
        [North] = {x = 0, y = 0},
        [East] = {x = 0, y = 0},
        [South] = {x = -13, y = -80},
        [West] = {x = 0, y = 0},
    }
}


local function translateDir(dir)
    if dir == NorthEast or dir == SouthEast then
        return East
    elseif dir == NorthWest or dir == SouthWest then
        return West
    end
    return dir
end

local function getOutfitInformationOffset(outfit, dir)
    if OutfitOffsets[outfit] then
        return OutfitOffsets[outfit][translateDir(dir)]
    end
    return {x = 0, y = 0}
end

local function onCreatureAppear(creature)
    local Offset = getOutfitInformationOffset(creature:getOutfit().type, creature:getDirection())
    creature:setInformationOffset(Offset.x, Offset.y)
end

local function onCreatureDirectionChange(creature, oldDirection, newDirection)
    local Offset = getOutfitInformationOffset(creature:getOutfit().type, newDirection)
    creature:setInformationOffset(Offset.x, Offset.y)
end

local function onCreatureOutfitChange(creature, newOutfit, oldOutfit)
    local Offset = getOutfitInformationOffset(newOutfit.type, creature:getDirection())
    creature:setInformationOffset(Offset.x, Offset.y)
end

function init()
    connect(LocalPlayer, {onOutfitChange = onCreatureOutfitChange})
    connect(Creature, {
        onAppear = onCreatureAppear,
        onDirectionChange = onCreatureDirectionChange,
        onOutfitChange = onCreatureOutfitChange
    })
end

function terminate()
    disconnect(LocalPlayer, {onOutfitChange = onCreatureOutfitChange})
    disconnect(Creature, {
        onAppear = onCreatureAppear,
        onDirectionChange = onCreatureDirectionChange,
        onOutfitChange = onCreatureOutfitChange
    })
end

 

A parte do módulo está finalizada, o que resta agora é configurar as Outfits na tabela com seus determinados Offsets, e não se preocupe, se a outfit não estiver configurada, ela vai seguir o padrão normal, o módulo só altera algo quando determinada Outfit está configurada.

 

Para configurar o módulo é simples, basta seguir o padrão:

    [ID DA OUTFIT AQUI] = { 
        [North] = {x = 0, y = 0},
        [East] = {x = 0, y = 0},
        [South] = {x = 0, y = 0},
        [West] = {x = -0, y = 0},
    },

Nos primeiros colchetes coloque o ID da sua Outfit para ter o offset modificado, os colchetes restantes são as direções, não é necessário mexer neles, dentro de cada índice da tabela tem os offsets X & Y, basta modificar o valor de acordo, sendo ele positivo ou negativo. NÃO SE ESQUEÇA DA VÍRGULA NO FINAL "},".

  • Snowsz pinned this tópico
  • Respostas 12
  • Visualizações 10.3k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • Diego Rulez
    Diego Rulez

    Eu não tinha percebido que a barra de life/mana ficava meio de lado, o coisinha nojenta..  Obviamente com sua edição ficou bem melhor.

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo