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.
Aqui era como as informações ficavam com essa Outfit originalmente, no padrão de sempre dos clients.
Comparativo em imagem estática:
Tibia Outfit antes e depois:
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:
Ekko depois:
Graves antes e depois:
Uganda Knuckle antes e depois:
Aqui eu estava brincando de por as informações da Outfit de anão de modo drogado kkk.
• 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 X & Y.
Creature:setInformationOffset(x, y)
Exemplo:
Creature:setInformationOffset(10, -5)
Essa configuração de offset vai aumentar X em 10 Pixels e diminuir Y em 5 Pixels, no meu primeiro gif, na direção Sul do Char, eu usei X diminuindo 13 Pixels e Y 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 "},".