Files
Leviathan/Server/GameServer/Game/GameDraw.cpp
T
2026-06-01 12:46:52 +02:00

232 lines
5.9 KiB
C++

#include <vector>
#include <network/XIOCP.h>
#include <toolkit/myDC.h>
#include <toolkit/XConsole.h>
#include <mmo/ArcadiaServer.h>
#include <framework/ArcadiaFramework.h>
#include <dump/XException.h>
#include <toolkit/XEnv.h>
#include "StructPlayer.h"
#include "StructNPC.h"
#include "StructSummon.h"
#include "StructItem.h"
#include "Constant.h"
myDC g_DC;
extern XCriticalSection g_Lock;
extern std::vector< StructPlayer* > g_vPlayer;
extern std::vector< StructItem* > g_vItem;
//extern std::vector< StructMonster* > g_vNPC;
extern std::vector< StructSummon* > g_vSummon;
extern XIOCP * g_pIOCP;
extern ArcadiaServer * g_pArcadia;
extern int g_nDrawMode;
int g_nDrawScale = 1;
inline int _S( int x ) { return x / g_nDrawScale; }
void DrawConsole( XConsole & console, int nStartPos = 0 )
{
for( int y = 0; y < console.GetHeight(); y++ )
{
g_DC.Printf( 5, (nStartPos + y )*14+5, console.GetLine( y ) );
}
}
void DrawRegion()
{
if( ENV().IsExist( "no_region" ) ) return;
g_DC.SetPenColor( RGB( 230, 230, 230 ) );
for( int x = 0; x < 1280*g_nDrawScale; x += g_nRegionSize )
{
g_DC.Line( 0, _S(x), 1280, _S(x ));
g_DC.Line( _S(x), 0, _S(x), 1024 );
}
g_DC.SetPenColor( 0 );
}
void DrawPlayer()
{
if( ENV().IsExist( "no_player" ) ) return;
for( unsigned i = 0; i < g_vPlayer.size(); i++ )
{
g_DC.SetPenColor( RGB( 100,200,100 ) );
AR_UNIT fx = g_vPlayer[i]->GetX();
AR_UNIT fy = g_vPlayer[i]->GetY();
if( g_vPlayer[i]->IsMoving() ) g_DC.DrawArrow( _S(fx), _S(fy), _S(g_vPlayer[i]->GetTX()), _S(g_vPlayer[i]->GetTY()) );
g_DC.SetPenColor( 0 );
COLORREF c = RGB( 200, 0, 0 );
if( g_vPlayer[i]->IsDead() ) c = RGB( 100, 100, 200 );
g_DC.Box( _S( g_vPlayer[i]->GetX() ) - 1, _S( g_vPlayer[i]->GetY() ) - 1, _S( g_vPlayer[i]->GetX() ) + 1, _S( g_vPlayer[i]->GetY() ) + 1, c, FILL_SOLID );
}
}
void DrawSummon()
{
if( ENV().IsExist( "no_summon" ) ) return;
for( unsigned i = 0; i < g_vSummon.size(); i++ )
{
g_DC.SetPenColor( RGB( 100,200,100 ) );
AR_UNIT fx = g_vSummon[i]->GetX();
AR_UNIT fy = g_vSummon[i]->GetY();
if( g_vSummon[i]->IsMoving() ) g_DC.DrawArrow( _S( fx ), _S( fy ), _S( g_vSummon[i]->GetTX() ), _S( g_vSummon[i]->GetTY() ) );
g_DC.SetPenColor( 0 );
COLORREF c = RGB( 200, 0, 200 );
if( g_vSummon[i]->IsDead() ) c = RGB( 100, 100, 200 );
g_DC.Box( _S( g_vSummon[i]->GetX() ) - 1, _S( g_vSummon[i]->GetY() ) - 1, _S( g_vSummon[i]->GetX() ) + 1, _S( g_vSummon[i]->GetY() ) + 1, c, FILL_SOLID );
}
}
void DrawItem()
{
if( ENV().IsExist( "no_item" ) ) return;
for( unsigned i = 0; i < g_vItem.size(); i++ )
{
//g_DC.SetPenColor( RGB( 200,200,0 ) );
AR_UNIT fx = g_vItem[i]->GetX();
AR_UNIT fy = g_vItem[i]->GetY();
g_DC.Box( _S( g_vItem[i]->GetX() ) - 1, _S( g_vItem[i]->GetY() ) - 1, _S( g_vItem[i]->GetX() ) + 1, _S( g_vItem[i]->GetY() ) + 1, RGB(200,200,0), FILL_SOLID );
}
}
void DrawNPC()
{
if( ENV().IsExist( "no_npc" ) ) return;
/*
for( unsigned i = 0; i < g_vNPC.size(); i++ )
{
g_DC.SetPenColor( RGB( 200,200,200 ) );
AR_UNIT fx = g_vNPC[i]->GetX();
AR_UNIT fy = g_vNPC[i]->GetY();
if( _S( fx ) > 1600 ) continue;
if( _S( fy ) > 1600 ) continue;
if( g_vNPC[i]->IsMoving() ) g_DC.DrawArrow( _S( fx ), _S( fy ), _S( g_vNPC[i]->GetTX() ), _S( g_vNPC[i]->GetTY() ) );
g_DC.SetPenColor( 0 );
COLORREF c = RGB( 200, 0, 0 );
if( !g_vNPC[i]->bIsNearClient ) c = RGB( 240, 200, 200 );
if( g_vNPC[i]->IsDead() ) c = RGB( 240, 240, 0 );
g_DC.Box( _S( g_vNPC[i]->GetX() ) - 1, _S( g_vNPC[i]->GetY() ) - 1, _S( g_vNPC[i]->GetX() ) + 1, _S( g_vNPC[i]->GetY() ) + 1, c, FILL_SOLID );
if( g_vNPC[i]->GetPriority() != ArObject::UPDATE_PRIORITY_IDLE )
{
g_DC.Box( _S( g_vNPC[i]->GetX() ) - 3, _S( g_vNPC[i]->GetY() ) - 3, _S( g_vNPC[i]->GetX() ) + 3, _S( g_vNPC[i]->GetY() ) + 3, RGB(240, 200, 200) );
}
}
*/
}
void DrawStat()
{
g_DC.Clear();
g_DC.Begin();
static XConsole statConsole(120, 10 );
static DWORD dwPrevTime = timeGetTime();
static long nIPS;
static int nActiveCnt, nCnt;
static float fUsage;
if( g_pIOCP )
{
nActiveCnt += g_pIOCP->GetActiveThreadCount();
nCnt++;
}
if( dwPrevTime + 1000 < timeGetTime() )
{
dwPrevTime = timeGetTime();
if( g_pIOCP )
{
static long nPrevIPS = 0;
nIPS = g_pIOCP->GetInstructionCount() - nPrevIPS;
nPrevIPS += nIPS;
}
fUsage = (float)nActiveCnt*100/(nCnt*g_pIOCP->GetTotalThreadCount()) ;
nCnt = 0;
nActiveCnt = 0;
}
statConsole.Clear();
statConsole.Printf( "Overview : ArTime(%8d) CPU Usage(%4.1f%%%%)\n", GetArTime(), fUsage );
statConsole.Printf( "Object Count : Client(%4d) NPC(%3d) Item(%3d)\n", g_vPlayer.size(), NPC_COUNT, g_vItem.size() );
if( g_pIOCP && g_pArcadia )
{
statConsole.Printf( "Thread Condition : Active/Total(%2d/%2d) Work/Wait(%d/%2d)\n", g_pIOCP->GetActiveThreadCount(), g_pIOCP->GetTotalThreadCount(), g_pArcadia->GetLockedThreadCount(), g_pArcadia->GetWaitingThreadCount() );
statConsole.Printf( "Instruction Proc : Total(%9d) IPS(%-5d)\n", g_pIOCP->GetInstructionCount(), nIPS );
}
statConsole.Printf( "\n\n\nF1 : display server stat F2 : display world objects\n" );
DrawConsole( statConsole );
HDC dc = GetDC( ArcadiaFrameworkIntf::GetViewWindow() );
BitBlt( dc, 0, 0, ArcadiaFrameworkIntf::GetViewRect().right, ArcadiaFrameworkIntf::GetViewRect().bottom, g_DC.GetDC(), 0, 0, SRCCOPY );
ReleaseDC( ArcadiaFrameworkIntf::GetViewWindow(), dc );
}
void DrawWorld()
{
THREAD_SYNCHRONIZE( g_Lock );
g_DC.Clear();
g_DC.Begin();
DrawRegion();
DrawPlayer();
DrawSummon();
DrawItem();
DrawNPC();
HDC dc = GetDC( ArcadiaFrameworkIntf::GetViewWindow() );
BitBlt( dc, 0, 0, ArcadiaFrameworkIntf::GetViewRect().right, ArcadiaFrameworkIntf::GetViewRect().bottom, g_DC.GetDC(), 0, 0, SRCCOPY );
ReleaseDC( ArcadiaFrameworkIntf::GetViewWindow(), dc );
}
void Draw()
{
/*
if( g_nDrawMode == MODE_WORLD && GetKeyState( VK_SCROLL ) )
{
return;
}
if( g_nDrawMode == MODE_STAT )
{
DrawStat();
return;
}*/
DrawWorld();
}