Solo usuarios registrados pueden comentar y agradecer, Logueate o Registrate

Autor Topic: Monster HP Bar main 5.2  (Visto 4136 veces)

0 Miembros and 2 Guests are viewing this topic.

Offline plyn Posteado: March 31, 2025, 10:58:56 AM | Modificado: April 01, 2025, 07:52:34 AM by plyn

  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 246
  • Gracias recibida: 768
  • br
WsClient.cpp

Code: [Select]
			case 0xE2:
GCNewHealthBarRecv((PMSG_NEW_HEALTH_BAR_RECV*)ReceiveBuffer);
return 1;
}

.cpp
Code: [Select]

CHealthBar gHealthBar;

CHealthBar::CHealthBar()
{
ClearNewHealthBar();
}

CHealthBar::~CHealthBar()
{

}

void GCNewHealthBarRecv(PMSG_NEW_HEALTH_BAR_RECV* lpMsg) // OK
{
gHealthBar.ClearNewHealthBar();

for (int n = 0;n < lpMsg->count;n++)
{
PMSG_NEW_HEALTH_RECV* lpInfo = (PMSG_NEW_HEALTH_RECV*)(((BYTE*)lpMsg) + sizeof(PMSG_NEW_HEALTH_BAR_RECV) + (sizeof(PMSG_NEW_HEALTH_RECV) * n));

gHealthBar.InsertNewHealthBar(lpInfo->index, lpInfo->type, lpInfo->rate, lpInfo->ViewHP);
}
}

void CHealthBar::ClearNewHealthBar() // OK
{
for (int n = 0;n < MAX_MAIN_VIEWPORT;n++)
{
gNewHealthBar[n].index = 0xFFFF;
gNewHealthBar[n].type = 0;
gNewHealthBar[n].rate = 0;
gNewHealthBar[n].ViewHP[0] = 0;
gNewHealthBar[n].ViewHP[1] = 0;
}
}

void  CHealthBar::InsertNewHealthBar(WORD index, BYTE type, BYTE rate, DWORD* ViewHP) // OK
{
for (int n = 0;n < MAX_MAIN_VIEWPORT;n++)
{
if (gNewHealthBar[n].index == 0xFFFF)
{
gNewHealthBar[n].index = index;
gNewHealthBar[n].type = type;
gNewHealthBar[n].rate = rate;
gNewHealthBar[n].ViewHP[0] = ViewHP[0];
gNewHealthBar[n].ViewHP[1] = ViewHP[1];

return;
}
}
}

NEW_HEALTH_BAR* CHealthBar::GetNewHealthBar(WORD index, BYTE type) // OK
{
for (int n = 0;n < MAX_MAIN_VIEWPORT;n++)
{
if (gNewHealthBar[n].index != 0xFFFF)
{
if (gNewHealthBar[n].index == index && gNewHealthBar[n].type == type)
{
return &gNewHealthBar[n];
}
}
}

return 0;
}

void CHealthBar::DrawNewHealthBar()
{
float Width = 85.f;
char Text[100], Text2[100], Text3[100];
vec3_t Angle;
int ScreenX, ScreenY;

static float LastHP[MAX_MAIN_VIEWPORT] = { 0 };
static float DamageTimer[MAX_MAIN_VIEWPORT] = { 0 };

for (int j = 0; j < MAX_MAIN_VIEWPORT; ++j)
{
auto ViewportAddress = &CharactersClient[j];

if (!ViewportAddress) continue;

NEW_HEALTH_BAR* lpNewHealthBar = GetNewHealthBar(ViewportAddress->Key, ViewportAddress->Object.Kind);
if (lpNewHealthBar == 0) continue;

Vector(
ViewportAddress->Object.Position[0],
ViewportAddress->Object.Position[1],
ViewportAddress->Object.Position[2] + ViewportAddress->Object.BoundingBoxMax[2] + 100.f,

Angle);

if (ViewportAddress->Object.Kind == 2)
{
BeginOpengl(0, 0, GetWindowsX, GetWindowsY);
Projection(Angle, &ScreenX, &ScreenY);
EndOpengl();

ScreenX -= (int)(Width / 2);

// Texto do HP aprimorado
auto FormatNumber = [](int num) -> std::string {
char buffer[16];
if (num >= 1000000000)  // 1 bilhão
sprintf(buffer, "%.1fKKK", num / 1000000000.0);
else if (num >= 1000000) // 1 milhão
sprintf(buffer, "%.1fKK", num / 1000000.0);
else if (num >= 1000)    // 1 mil
sprintf(buffer, "%.1fK", num / 1000.0);
else
sprintf(buffer, "%d", num);
return std::string(buffer);
};

std::string hpCurrent = FormatNumber(lpNewHealthBar->ViewHP[0]);
std::string hpMax = FormatNumber(lpNewHealthBar->ViewHP[1]);

sprintf(Text, "%s / %s (%d%%)", hpCurrent.c_str(), hpMax.c_str(), lpNewHealthBar->rate);

g_pRenderText->SetFont(g_hFont);
g_pRenderText->SetTextColor(255, 255, 255, 255);
g_pRenderText->SetBgColor(0, 0, 0, 128);
g_pRenderText->RenderText(ScreenX + (Width / 2), ScreenY - 8, Text, Width, 0, 8);

sprintf(Text2, "%s", ViewportAddress->ID);
g_pRenderText->RenderText(ScreenX + (Width / 2), ScreenY - 18, Text2, Width, 0, 8);

// Barra de fundo
EnableAlphaTest();
glColor4f(0.2f, 0.2f, 0.2f, 0.8f);
RenderColor((float)(ScreenX), (float)(ScreenY + 2), Width, 6.f);

// Cálculo da porcentagem do HP
float HP_Percentage = (float)lpNewHealthBar->ViewHP[0] / (float)lpNewHealthBar->ViewHP[1];
float HP_Width = Width * HP_Percentage;

// Se a vida diminuiu, inicia o timer e mantém a barra de marcação do dano
if (lpNewHealthBar->ViewHP[0] < LastHP[j]) {
DamageTimer[j] = 2.0f; // Agora dura 1,5 segundos antes de desaparecer
}

// Suaviza a descida da barra de marcação do dano
if (LastHP[j] > lpNewHealthBar->ViewHP[0]) {
LastHP[j] -= ((LastHP[j] - lpNewHealthBar->ViewHP[0]) * 0.05f); // Suavização lenta
}
else {
LastHP[j] = lpNewHealthBar->ViewHP[0];
}

float LastHP_Percentage = (float)LastHP[j] / (float)lpNewHealthBar->ViewHP[1];
float LastHP_Width = min(Width, Width * LastHP_Percentage);

// Reduz gradualmente a transparência da marcação do dano
if (DamageTimer[j] > 0) {
glColor4f(0.8f, 0.0f, 0.0f, DamageTimer[j] * 0.66f); // Mais opaco no início, sumindo devagar
RenderColor((float)(ScreenX + HP_Width), (float)(ScreenY + 3), LastHP_Width - HP_Width, 4.f);
DamageTimer[j] -= 0.008f; // Agora a transparência desaparece mais devagar
}

// Barra de HP principal com gradiente
float Red = 1.0f - HP_Percentage;
float Green = HP_Percentage;
glColor4f(Red, Green, 0.f, 1.f);
RenderColor((float)(ScreenX + 1), (float)(ScreenY + 3), HP_Width - 2, 4.f);

DisableAlphaBlend();
}
else if(ViewportAddress->Object.Kind == 1)
{

BeginOpengl(0, 0, GetWindowsX, GetWindowsY);
Projection(Angle, &ScreenX, &ScreenY);
EndOpengl();
if (CheckMouseIn(ScreenX - 20, ScreenY, 40, 120))
{
if (GetAsyncKeyState(VK_CONTROL) & 0x8000) {

EnableAlphaTest();

glColor4f(0, 0.f, 0.f, 1.f);
RenderColor((float)((GetWindowsX / 2) - 51), (float)(GetWindowsY - 80 - 1), 102, 8.f);

glColor4f(1.f, 0.f, 0.f, 1.f);
RenderColor((float)((GetWindowsX / 2) - 50), (float)(GetWindowsY - 80), lpNewHealthBar->rate, 6.f);

DisableAlphaBlend();
glColor3f(1.f, 1.f, 1.f);

EnableAlphaBlend();

g_pRenderText->SetFont(g_hFont);
g_pRenderText->SetTextColor(255, 255, 255, 255);
g_pRenderText->SetBgColor(0, 0, 0, 0);

sprintf(Text3, "%d%%", lpNewHealthBar->rate);

g_pRenderText->RenderText((float)((GetWindowsX / 2)), (float)(GetWindowsY - 81), Text3, 100.f, 0, 8);
}
}
}

}
DisableAlphaBlend();
glColor3f(1.f, 1.f, 1.f);
}



.h
Code: [Select]

#define MAX_MAIN_VIEWPORT 400

struct NEW_HEALTH_BAR
{
WORD index;
BYTE type;
BYTE rate;
DWORD ViewHP[2];
};


class CHealthBar {
public:
CHealthBar();
~CHealthBar();

void ClearNewHealthBar();
NEW_HEALTH_BAR* GetNewHealthBar(WORD index, BYTE type);
void DrawNewHealthBar();
void InsertNewHealthBar(WORD index, BYTE type, BYTE rate, DWORD* ViewHP);

private:
NEW_HEALTH_BAR gNewHealthBar[MAX_MAIN_VIEWPORT];
};

extern CHealthBar gHealthBar;



Call:
Code: [Select]
bool SEASON3B::CNewUINameWindow::Render()
{
EnableAlphaTest();
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
RenderName();
    RenderTimes();
    matchEvent::RenderMatchTimes ();
    RenderBooleans();
DrawPersonalShopTitleImp();
DisableAlphaBlend();

if (SceneFlag == MAIN_SCENE)
{
gInterface.m_Lua.Generic_Call("BeforeMainProc", ">");
gHealthBar.DrawNewHealthBar(); //hpbar
g_pReconnect->ReconnectMainProc();
}
return true;
}






O HPBar dos montros tem um efeito "Delay" quando ataca
A Barra de vida do Personagem aperte CTRL e posicione o mouse em cima do personagem

01/04 algumas estruturas do .h que não enviei
Code: [Select]
struct PMSG_NEW_HEALTH_BAR_RECV
{
PSWMSG_HEAD header; // C2:F3:E2
BYTE count;
};

struct PMSG_NEW_HEALTH_RECV
{
WORD index;
BYTE type;
BYTE rate;
DWORD ViewHP[2];
};



Server Side

Protocol.h
Code: [Select]
void GCNewHealthBarSend(LPOBJ lpObj) // OK
{
#if(GAMESERVER_EXTRA==1)

#if(GAMESERVER_UPDATE<=603)

if(gServerInfo.m_MonsterHealthBarSwitch == 0)
{
return;
}

BYTE send[4096];

PMSG_NEW_HEALTH_BAR_SEND pMsg;

pMsg.header.set(0xF3,0xE2,0);

int size = sizeof(pMsg);

pMsg.count = 0;

PMSG_NEW_HEALTH_BAR info;

for(int n=0;n < MAX_VIEWPORT;n++)
{
if(lpObj->VpPlayer[n].state != VIEWPORT_SEND && lpObj->VpPlayer[n].state != VIEWPORT_WAIT)
{
continue;
}

if (lpObj->VpPlayer[n].type == OBJECT_MONSTER && gServerInfo.m_MonsterHealthBarSwitch == 0)
{
continue;
}

if (lpObj->VpPlayer[n].type == OBJECT_USER && gServerInfo.m_UserHealthBarSwitch == 0)
{
continue;
}

if(OBJECT_RANGE(lpObj->VpPlayer[n].index) == 0)
{
continue;
}

LPOBJ lpTarget = &gObj[lpObj->VpPlayer[n].index];

if(lpTarget->Live == 0 || lpTarget->State != OBJECT_PLAYING || OBJECT_RANGE(lpTarget->SummonIndex) != 0 || CC_MAP_RANGE(lpTarget->Map) != 0)
{
continue;
}

info.index = lpTarget->Index;

info.type = (BYTE)lpTarget->Type;

info.rate = (BYTE)((lpTarget->Life*100)/(lpTarget->MaxLife+lpTarget->AddLife));

info.ViewHP[0] = (DWORD)(lpTarget->Life);

info.ViewHP[1] = (DWORD)(lpTarget->MaxLife);

memcpy(&send[size],&info,sizeof(info));
size += sizeof(info);

pMsg.count++;
}

pMsg.header.size[0] = SET_NUMBERHB(size);

pMsg.header.size[1] = SET_NUMBERLB(size);

memcpy(send,&pMsg,sizeof(pMsg));

DataSend(lpObj->Index,send,size);

#endif

#endif
}


Protocol.h

Code: [Select]
struct PMSG_NEW_HEALTH_BAR_SEND
{
PSWMSG_HEAD header; // C2:F3:E2
BYTE count;
};


struct PMSG_NEW_HEALTH_BAR
{
WORD index;
BYTE type;
BYTE rate;
DWORD ViewHP[2];
};



Creditos: eu

Hisashiburi dana, Mugiwara!

Offline Ryzenn #1 Posteado: March 31, 2025, 11:07:01 AM

  • Colaborador
  • +1 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 291
  • Gracias recibida: 4894
  • ar
Top mano, parabens

Se tu mismo, lo demás lo vas aprendiendo por el camino.

Gracias:


Offline myway #2 Posteado: March 31, 2025, 12:16:53 PM

  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 201
  • Gracias recibida: 821
  • ar
EXECELENTE BRO !!!


Offline xlockee #3 Posteado: March 31, 2025, 07:56:21 PM

  • 0 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 12
  • Gracias recibida: 8
  • br
onde eu adiciono essas função na src?


Offline JuniorInc #4 Posteado: March 31, 2025, 09:53:46 PM

  • 0 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 4
  • Gracias recibida: 0
  • br
Sem os #include e com informações faltando, para que serve este tópico? Os administradores deveriam removê-lo.


Offline zhangjianle865 #5 Posteado: April 01, 2025, 04:45:35 AM | Modificado: April 06, 2025, 08:27:51 PM by zhangjianle865

  • 0 puntos por ventas
  • *
  • Rank: Experto
  • Posts: 152
  • Gracias recibida: 141
  • ca

Offline plyn #6 Posteado: April 01, 2025, 08:09:54 AM

  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 246
  • Gracias recibida: 768
  • br
Topico atualizado

Hisashiburi dana, Mugiwara!

Offline plyn #7 Posteado: April 01, 2025, 08:21:23 AM

  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 246
  • Gracias recibida: 768
  • br
Sem os #include e com informações faltando, para que serve este tópico? Os administradores deveriam removê-lo.

deveria mesmo

Hisashiburi dana, Mugiwara!

Offline JuniorInc #8 Posteado: April 01, 2025, 12:40:03 PM

  • 0 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 4
  • Gracias recibida: 0
  • br
O vídeo está ótimo, mas esse tutorial está bem bagunçado. Nem os #include estão nos arquivos. Não seria possível postar de forma mais organizada?


Offline Ryzenn #9 Posteado: April 01, 2025, 05:31:47 PM

  • Colaborador
  • +1 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 291
  • Gracias recibida: 4894
  • ar
O vídeo está ótimo, mas esse tutorial está bem bagunçado. Nem os #include estão nos arquivos. Não seria possível postar de forma mais organizada?

Mira lo que te quejas hermano, después preguntan por qué ya no quieren aportar cosas jajajaja

Se tu mismo, lo demás lo vas aprendiendo por el camino.

Offline frajola #10 Posteado: April 02, 2025, 09:52:04 PM

  • 0 puntos por ventas
  • *
  • Rank: Dedicado
  • Posts: 49
  • Gracias recibida: 4
  • br
É possível fazer uma barra de vida separada para boss? assim como é no plugin matrix do louis?


Offline plyn #11 Posteado: April 04, 2025, 12:15:17 PM

  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 246
  • Gracias recibida: 768
  • br
É possível fazer uma barra de vida separada para boss? assim como é no plugin matrix do louis?

Sim, só tem que por as verificações corretas

Hisashiburi dana, Mugiwara!

Offline frajola #12 Posteado: April 05, 2025, 09:29:20 AM

  • 0 puntos por ventas
  • *
  • Rank: Dedicado
  • Posts: 49
  • Gracias recibida: 4
  • br
É possível fazer uma barra de vida separada para boss? assim como é no plugin matrix do louis?

Sim, só tem que por as verificações corretas

E tu pode fazer isso e compartilhar pra gente?

 lucha


Offline plyn #13 Posteado: April 06, 2025, 09:14:09 AM

  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 246
  • Gracias recibida: 768
  • br
É possível fazer uma barra de vida separada para boss? assim como é no plugin matrix do louis?

Sim, só tem que por as verificações corretas

E tu pode fazer isso e compartilhar pra gente?

 lucha

No momento eu ando meio sem tempo, mano, mas quando eu voltar a mexer faço sim

Hisashiburi dana, Mugiwara!

Offline Xingaw #14 Posteado: April 06, 2025, 10:47:25 AM

  • 0 puntos por ventas
  • *
  • Rank: Usuario activo
  • Posts: 71
  • Gracias recibida: 34
  • vn
lots of good stuff sharing on 5.2. hopefully someone will share muhelper for 5.2. ^_^


Offline zhangjianle865 #15 Posteado: April 06, 2025, 08:27:24 PM

  • 0 puntos por ventas
  • *
  • Rank: Experto
  • Posts: 152
  • Gracias recibida: 141
  • ca
Hello, brother.
There is a problem with the Monster HP Bar. Sometimes a HP Bar will be generated even if there is no Monster.


https://imgur.com/a/XqhkW79


Offline plyn #16 Posteado: April 07, 2025, 10:04:07 AM

  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 246
  • Gracias recibida: 768
  • br
Hello, brother.
There is a problem with the Monster HP Bar. Sometimes a HP Bar will be generated even if there is no Monster.


https://imgur.com/a/XqhkW79


esse erro se nao me engano é no       

Vector( ViewportAddress->Object.Position[0], ViewportAddress->Object.Position[1], ViewportAddress->Object.Position[2] + ViewportAddress->Object.BoundingBoxMax[2] + 100.f,Angle);

ou BeginOpengl(0, 0, GetWindowsX, GetWindowsY);

geralmente é BeginOpengl(0, 0, 640, 480);

eu uso GetWindowsX e GetWindowsY por conta do Widescreen

Hisashiburi dana, Mugiwara!

Offline manojl #17 Posteado: April 11, 2025, 02:49:41 PM | Modificado: April 12, 2025, 09:25:27 PM by manojl

  • 0 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 13
  • Gracias recibida: 2
  • br
TOP MANIN, tava querendo adicionar no meu servidor, porem sou meio leigo, consegue fazer um tutorial um pouquinho mais detalhado de como add?
Estou com erro nessa parte
Spoiler for Hiden:

Pfv, eu estou editando uma main 5.2 q veio sem HPBAR e isso me salvaria muito!!!
obg des de ja!

Gracias:


Offline manojl #18 Posteado: April 12, 2025, 01:54:51 PM | Modificado: April 12, 2025, 09:26:59 PM by manojl

  • 0 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 13
  • Gracias recibida: 2
  • br
[PT-BR]
Olá! Poderia me dar uma ajudinha!? Estou usando a Main 5.2(Rox Gaming), porém ela não tem HPBar...
Estou tentando adicionar esse HPBar na main 5.2 porem o código postado parece incompleto...
Pelo vídeo postado no tópico a base é a mesma que estou utilizando...
Por Favor, sou noob mas não estou pedindo para fazer por mim, apenas uma dica de como utilizar o código!

[ES-GOOGLE]
¡Hola! ¿Podrías darme un poquito de ayuda? Estoy usando Main 5.2 (Rox Gaming), pero no tiene HPBar...
Estoy intentando agregar esta HPBar en la versión principal 5.2, pero el código publicado parece incompleto...
Del vídeo publicado en el tema, la base es la misma que estoy usando...
Por favor, soy un novato pero no te pido que lo hagas por mí, ¡solo un consejo sobre cómo usar el código!


Main:
https://tuservermu.com.ve/index.php?topic=77840.0



Offline vcore30 #19 Posteado: April 13, 2025, 05:36:21 AM

  • 0 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 97
  • Gracias recibida: 899
  • ru
TOP MANIN, tava querendo adicionar no meu servidor, porem sou meio leigo, consegue fazer um tutorial um pouquinho mais detalhado de como add?
Estou com erro nessa parte
Spoiler for Hiden:

Pfv, eu estou editando uma main 5.2 q veio sem HPBAR e isso me salvaria muito!!!
obg des de ja!

This function needs to be added to GameServer

Gracias:


Solo usuarios registrados pueden comentar y agradecer, Logueate o Registrate


 

Related Topics

  Subject / Started by Replies Last post
1 Replies
1808 Views
Last post October 27, 2017, 09:12:59 AM
by caron22
4 Replies
6526 Views
Last post September 28, 2019, 04:58:06 PM
by Ryuno
6 Replies
1253 Views
Last post November 30, 2019, 10:51:49 AM
by Narrow
5 Replies
4786 Views
Last post March 01, 2023, 08:49:46 PM
by neurosi
4 Replies
2372 Views
Last post May 19, 2025, 04:01:55 AM
by elfazor