Ich hau hier heute mal dass V19 Target Information raus, da ich Jopsii einfach nur Inkompetent finde, und er es total scheiße "gecoded" hat, werde ich hier mal dass von Crasy raus hauen, was immerhin komplett kopiert von Offi ist, Fehlerfrei läuft und dazu noch einfach einbinden ist.
Wer nicht weiß was V19 Target Information ist, hier:

Vorrab: wer nicht alles auf der need to work liste hat, braucht garnicht erst versuchen es einzubauen, es wird nicht laufen.
Need to work list:
- V19 ResData
- V19 PropMover inkl. alle Parameter richtig geladen
- V19 Header Dateien (defineNeuz, ..)
- V19 PropJob inkl. alle parameter richtig laden (ins. der letzte)
- Zeit, viel Zeit..

Nachdem ihr alles auf der liste oben habt, könnt ihr weiter lesen, wenn nicht holt diese bitte nach, noch 2 wichtige punkte:
Quote:
propJob.inc hat einen Parameter Namens "ICON", dieser sollte in der struct JobProp sein und den Namen "szIcon" tragen.
Gut fangen wir mit dem allgemeinen aufrufen des Fenster's an, was sehr simple ist.Quote:
propMover hat zwei Parameter Namens "dwAreaColor" und "szNpcMark", diese sollten auch so in der MoverProp struct stehen.
Öffnet die datei WndManager.h in der Neuz, anschließend sucht ihr nach:
PHP Code:
class CWndMgr : public CWndBase
PHP Code:
#ifdef __GUILD_HOUSE_MIDDLE
CWndGuildHouseBid* m_pWndGHBid;
#endif //__GUILD_HOUSE_MIDDLE
PHP Code:
CWndTargetInformation* m_pWndTargetInfo;
Öffnet jetzt die WndManager.cpp und geht in die Funktion
PHP Code:
void CWndMgr::OpenTitle( BOOL bFirstTime )
PHP Code:
m_pWndTargetInfo = new CWndTargetInformation;
m_pWndTargetInfo->SetMover( g_pPlayer );
m_pWndTargetInfo->Initialize();
m_pWndTargetInfo->SetVisible( FALSE );
PHP Code:
CWndMgr::CWndMgr()
PHP Code:
m_pWndTargetInfo = nullptr;
PHP Code:
CWndMgr::Free()
PHP Code:
SAFE_DELETE( m_pWndTargetInfo );
Öffnet zuletzt die WndWorld.cpp und sucht nach
PHP Code:
void CWndWorld::RenderSelectObj( C2DRender* p2DRender, CObj* pObj )
PHP Code:
CWorld* pWorld = g_WorldMng.Get();
if(m_pRenderTargetObj)
pObj = m_pRenderTargetObj;
PHP Code:
if( pObj )
{
CMover* pTarget = (CMover*)pObj;
g_WndMng.m_pWndTargetInfo->SetMover( pTarget );
g_WndMng.m_pWndTargetInfo->SetVisible( TRUE );
}
else
{
g_WndMng.m_pWndTargetInfo->SetState( FALSE );
g_WndMng.m_pWndTargetInfo->SetVisible( FALSE );
}
return;
Jetzt habt ihr eigentlich dass einbinden überstanden, nur noch der nächsten teil fehlt und zwar dass eigentliche Fenster worüber wir eigentlich schon reden.
Öffnet die WndField.h und fügt am ende dass hier ein:
PHP Code:
class CWndTargetInformation : public CWndNeuz
{
public:
CWndTargetInformation();
virtual ~CWndTargetInformation();
// Default
virtual void OnDraw( C2DRender* p2DRender );
virtual void OnInitialUpdate();
virtual BOOL Initialize( CWndBase* pWndParent = NULL,DWORD dwWndId = 0 );
virtual BOOL OnCommand( UINT nID, DWORD dwMessage, CWndBase* pWndBase = NULL ) { return CWndNeuz::OnCommand( nID, dwMessage, pWndBase ); }
virtual BOOL OnChildNotify( UINT message, UINT nID, LRESULT* pLResult ) { return CWndNeuz::OnChildNotify( message, nID, pLResult ); }
virtual void OnSize(UINT nType, int cx, int cy) { CWndNeuz::OnSize( nType, cx, cy ); }
virtual void MakeGaugeVertex();
virtual void SetWndRect( CRect rectWnd, BOOL bOnSize = TRUE );
virtual BOOL OnEraseBkgnd(C2DRender* p2DRender);
virtual HRESULT RestoreDeviceObjects();
virtual HRESULT DeleteDeviceObjects();
virtual HRESULT InvalidateDeviceObjects();
void SetMover( CMover* pMover );
void SetState( BOOL bS ) { bState = bS; }
private:
CTexture* pTextureJob;
LPWNDCTRL lpRank[6];
LPWNDCTRL lpHP;
LPWNDCTRL lpMP;
LPWNDCTRL lpEle;
CMover* pTarget;
CTexture pTexGauFillNormal1;
CTexture pTexGauFillNormal2;
CTexture* pTexTelement[6];
CTexture* pTexRank[3];
CTexture* pTargetNum[10];
CTexture* pTexRankRed[3];
CTexture* pTexRankPurple[3];
CTexture* pTexRankBlue[3];
LPDIRECT3DVERTEXBUFFER9 pHPGauge;
LPDIRECT3DVERTEXBUFFER9 pMPGauge;
BOOL bHPGauge;
BOOL bMPGauge;
BOOL bState;
int nHPWidth;
int nMPWidth;
};
PHP Code:
CWndTargetInformation::CWndTargetInformation()
{
pTarget = NULL;
nHPWidth = -1;
nMPWidth = -1;
pHPGauge = NULL;
pMPGauge = NULL;
bHPGauge = TRUE;
bMPGauge = TRUE;
bState = FALSE;
}
CWndTargetInformation::~CWndTargetInformation()
{
DeleteDeviceObjects();
}
HRESULT CWndTargetInformation::DeleteDeviceObjects()
{
CWndBase::DeleteDeviceObjects();
return InvalidateDeviceObjects();
}
HRESULT CWndTargetInformation::RestoreDeviceObjects()
{
CWndBase::RestoreDeviceObjects();
if( pHPGauge == NULL )
{
m_pApp->m_pd3dDevice->CreateVertexBuffer( sizeof( TEXTUREVERTEX2 ) * 3 * 6, D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, D3DFVF_TEXTUREVERTEX2, D3DPOOL_DEFAULT, &pHPGauge, NULL );
m_pApp->m_pd3dDevice->CreateVertexBuffer( sizeof( TEXTUREVERTEX2 ) * 3 * 6, D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, D3DFVF_TEXTUREVERTEX2, D3DPOOL_DEFAULT, &pMPGauge, NULL );
nHPWidth = -1;
nMPWidth = -1;
}
return S_OK;
}
HRESULT CWndTargetInformation::InvalidateDeviceObjects()
{
CWndBase::InvalidateDeviceObjects();
SAFE_RELEASE( pHPGauge );
SAFE_RELEASE( pMPGauge );
return S_OK;
}
void CWndTargetInformation::MakeGaugeVertex()
{
LPWNDCTRL lpHP = GetWndCtrl( WIDC_CUSTOM1 );
LPWNDCTRL lpMP = GetWndCtrl( WIDC_CUSTOM2 );
CRect rect = GetClientRect();
CRect rectTemp;
int nWidthClient = lpHP->rect.Width();
int nWidth;
nWidth = nWidthClient * (__int64)pTarget->GetHitPoint() / (__int64)pTarget->GetMaxHitPoint();
if( nHPWidth != nWidth )
{
nHPWidth = nWidth;
rect = lpHP->rect;
rectTemp = rect;
rectTemp.right = rectTemp.left + nWidth;
ClientToScreen( rectTemp );
bHPGauge = m_pTheme->MakeGaugeVertex( m_pApp->m_pd3dDevice, &rectTemp, 0xffffffff, pHPGauge, &pTexGauFillNormal1 );
}
nWidth = nWidthClient * (__int64)pTarget->GetManaPoint() / (__int64)pTarget->GetMaxManaPoint();
if( nMPWidth != nWidth )
{
nMPWidth = nWidth;
rect = lpMP->rect;
rectTemp = rect;
rectTemp.right = rectTemp.left + nWidth;
ClientToScreen( rectTemp );
bMPGauge = m_pTheme->MakeGaugeVertex( m_pApp->m_pd3dDevice, &rectTemp, 0xffffffff, pMPGauge, &pTexGauFillNormal2 );
}
}
void CWndTargetInformation::SetMover( CMover* pMover )
{
pTarget = pMover;
if( pTarget->IsPlayer() )
pTextureJob = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, prj.m_aPropJob[pTarget->m_nJob].szIcon ), 0xffff00ff);
else if( pTarget->IsPeaceful() || pTarget->GetProp()->dwClass == RANK_GUARD )
pTextureJob = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, pTarget->GetProp()->szNpcMark ), 0xffff00ff);
else
pTextureJob = NULL;
if( pTarget->IsPlayer() || pTarget->IsPeaceful() || pTarget->GetProp()->dwClass == RANK_GUARD )
SetTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "WndTargetInfornation02.tga" ), TRUE );
else
SetTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "WndTargetInfornation.tga" ), TRUE );
if( !pTarget->IsPlayer() || !pTarget->IsPeaceful() )
{
switch( pTarget->GetProp()->dwAreaColor )
{
case AREA_NORMAL:
{
pTexRank[0] = pTexRankBlue[0];
pTexRank[1] = pTexRankBlue[1];
pTexRank[2] = pTexRankBlue[2];
}
break;
case AREA_CASH:
{
pTexRank[0] = pTexRankPurple[0];
pTexRank[1] = pTexRankPurple[0];
pTexRank[2] = pTexRankPurple[0];
}
break;
case AREA_DUNGEON:
case AREA_INSTANCE:
{
pTexRank[0] = pTexRankRed[0];
pTexRank[1] = pTexRankRed[0];
pTexRank[2] = pTexRankRed[0];
}
break;
}
}
}
void CWndTargetInformation::OnDraw( C2DRender* p2DRender )
{
LPWNDCTRL pStatic2 = GetWndCtrl( WIDC_STATIC2 ); //=> Ignore, still for Texture Job.
CD3DFont* pOldFont = p2DRender->GetFont();
p2DRender->SetFont( CWndBase::m_Theme.m_pFontWndTitle );
CWndStatic* pStatic = (CWndStatic*)GetDlgItem( WIDC_STATIC1 );
pStatic->SetFont( CWndBase::m_Theme.m_pFontWndTitle );
pStatic->SetTitle( pTarget->GetName() );
if( pTarget->m_bActiveAttack )
pStatic->m_dwColor = 0xffff0000;
char szBuffer[32];
sprintf_s( szBuffer, "%d", pTarget->GetLevel() );
int nLenght = strlen( szBuffer );
int nPos, nLevel = NULL;
if( !pTarget->IsPlayer() && !pTarget->IsPeaceful() && pTarget->GetProp()->dwClass != RANK_GUARD )
{
switch( pTarget->GetProp()->eElementType )
{
case 0: pTexTelement[3]->Render( p2DRender, CPoint( lpEle->rect.left, lpEle->rect.top ) ); break;
case 1: pTexTelement[1]->Render( p2DRender, CPoint( lpEle->rect.left, lpEle->rect.top ) ); break;
case 2: pTexTelement[0]->Render( p2DRender, CPoint( lpEle->rect.left, lpEle->rect.top ) ); break;
case 3: pTexTelement[2]->Render( p2DRender, CPoint( lpEle->rect.left, lpEle->rect.top ) ); break;
case 4: pTexTelement[5]->Render( p2DRender, CPoint( lpEle->rect.left, lpEle->rect.top ) ); break;
case 5: pTexTelement[4]->Render( p2DRender, CPoint( lpEle->rect.left, lpEle->rect.top ) ); break;
}
for( int i = 0; i < nLenght; i++ )
{
nLevel = szBuffer[i] - '0';
if( nLenght == 3 )
pTargetNum[nLevel]->Render( p2DRender, CPoint( lpEle->rect.left+5-nPos, lpEle->rect.top+12 ) );
else if( nLenght == 2 )
pTargetNum[nLevel]->Render( p2DRender, CPoint( lpEle->rect.left+10-nPos, lpEle->rect.top+12 ) );
else if( nLenght == 1 )
pTargetNum[nLevel]->Render( p2DRender, CPoint( lpEle->rect.left+15-nPos, lpEle->rect.top+12 ) );
nPos -= 10;
}
switch( pTarget->GetProp()->dwClass )
{
case RANK_LOW:
pTexRank[0]->Render( p2DRender, CPoint( lpRank[0]->rect.left, lpRank[0]->rect.top ) ); break;
case RANK_NORMAL:
{
pTexRank[0]->Render( p2DRender, CPoint( lpRank[0]->rect.left, lpRank[0]->rect.top ) );
pTexRank[1]->Render( p2DRender, CPoint( lpRank[1]->rect.left, lpRank[1]->rect.top ) );
}
break;
case RANK_CAPTAIN:
{
pTexRank[0]->Render( p2DRender, CPoint( lpRank[0]->rect.left, lpRank[0]->rect.top ) );
pTexRank[1]->Render( p2DRender, CPoint( lpRank[1]->rect.left, lpRank[1]->rect.top ) );
pTexRank[2]->Render( p2DRender, CPoint( lpRank[2]->rect.left, lpRank[2]->rect.top ) );
}
break;
case RANK_MIDBOSS:
{
pTexRank[0]->Render( p2DRender, CPoint( lpRank[0]->rect.left, lpRank[0]->rect.top ) );
pTexRank[1]->Render( p2DRender, CPoint( lpRank[1]->rect.left, lpRank[1]->rect.top ) );
pTexRank[2]->Render( p2DRender, CPoint( lpRank[2]->rect.left, lpRank[2]->rect.top ) );
pTexRank[2]->Render( p2DRender, CPoint( lpRank[3]->rect.left, lpRank[3]->rect.top ) );
}
break;
case RANK_BOSS:
{
pTexRank[0]->Render( p2DRender, CPoint( lpRank[0]->rect.left, lpRank[0]->rect.top ) );
pTexRank[1]->Render( p2DRender, CPoint( lpRank[1]->rect.left, lpRank[1]->rect.top ) );
pTexRank[2]->Render( p2DRender, CPoint( lpRank[2]->rect.left, lpRank[2]->rect.top ) );
pTexRank[2]->Render( p2DRender, CPoint( lpRank[3]->rect.left, lpRank[3]->rect.top ) );
pTexRank[1]->Render( p2DRender, CPoint( lpRank[4]->rect.left, lpRank[4]->rect.top ) );
}
break;
case RANK_SUPER:
{
pTexRank[0]->Render( p2DRender, CPoint( lpRank[0]->rect.left, lpRank[0]->rect.top ) );
pTexRank[1]->Render( p2DRender, CPoint( lpRank[1]->rect.left, lpRank[1]->rect.top ) );
pTexRank[2]->Render( p2DRender, CPoint( lpRank[2]->rect.left, lpRank[2]->rect.top ) );
pTexRank[2]->Render( p2DRender, CPoint( lpRank[3]->rect.left, lpRank[3]->rect.top ) );
pTexRank[1]->Render( p2DRender, CPoint( lpRank[4]->rect.left, lpRank[4]->rect.top ) );
pTexRank[0]->Render( p2DRender, CPoint( lpRank[5]->rect.left, lpRank[5]->rect.top ) );
}
break;
}
}
MakeGaugeVertex();
if( bHPGauge )
m_pTheme->RenderGauge( p2DRender->m_pd3dDevice, pHPGauge, &pTexGauFillNormal1 );
if( bMPGauge )
m_pTheme->RenderGauge( p2DRender->m_pd3dDevice, pMPGauge, &pTexGauFillNormal2 );
if( pTextureJob != NULL && pTarget->IsPlayer() || pTarget->IsPeaceful() || pTarget->GetProp()->dwClass == RANK_GUARD )
pTextureJob->Render( p2DRender, CPoint( pStatic2->rect.left, pStatic2->rect.top ) );
p2DRender->SetFont( pOldFont );
}
void CWndTargetInformation::OnInitialUpdate()
{
CWndNeuz::OnInitialUpdate();
RestoreDeviceObjects();
pTexGauFillNormal1.LoadTexture( m_pApp->m_pd3dDevice, MakePath( DIR_THEME, "Targetgauge01.tga" ), 0xffff00ff, TRUE );
pTexGauFillNormal2.LoadTexture( m_pApp->m_pd3dDevice, MakePath( DIR_THEME, "Targetgauge02.tga" ), 0xffff00ff, TRUE );
pTexTelement[0] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "eElementTypeBlue01.tga" ), 0xffff00ff);
pTexTelement[1] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "eElementTypeRed01.tga" ), 0xffff00ff);
pTexTelement[2] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "eElementTypeYellow01.tga" ), 0xffff00ff);
pTexTelement[3] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "eElementTypeWhite01.tga" ), 0xffff00ff);
pTexTelement[4] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "eElementTypePurple01.tga" ), 0xffff00ff);
pTexTelement[5] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "eElementTypeGreen01.tga" ), 0xffff00ff);
pTargetNum[0] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "TargetNum0.tga" ), 0xffff00ff);
pTargetNum[1] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "TargetNum1.tga" ), 0xffff00ff);
pTargetNum[2] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "TargetNum2.tga" ), 0xffff00ff);
pTargetNum[3] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "TargetNum3.tga" ), 0xffff00ff);
pTargetNum[4] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "TargetNum4.tga" ), 0xffff00ff);
pTargetNum[5] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "TargetNum5.tga" ), 0xffff00ff);
pTargetNum[6] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "TargetNum6.tga" ), 0xffff00ff);
pTargetNum[7] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "TargetNum7.tga" ), 0xffff00ff);
pTargetNum[8] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "TargetNum8.tga" ), 0xffff00ff);
pTargetNum[9] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "TargetNum9.tga" ), 0xffff00ff);
lpRank[0] = GetWndCtrl( WIDC_CUSTOM10 ); // 1. Klein
lpRank[1] = GetWndCtrl( WIDC_CUSTOM9 ); // 1. Mittel
lpRank[2] = GetWndCtrl( WIDC_CUSTOM8 ); // 1. Groß
lpRank[3] = GetWndCtrl( WIDC_CUSTOM6 ); // 2. Groß
lpRank[4] = GetWndCtrl( WIDC_CUSTOM5 ); // 2. Mittel
lpRank[5] = GetWndCtrl( WIDC_CUSTOM7 ); // 2. Klein
lpHP = GetWndCtrl( WIDC_CUSTOM1 );
lpMP = GetWndCtrl( WIDC_CUSTOM2 );
lpEle = GetWndCtrl( WIDC_CUSTOM4 );
pTexRankRed[0] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "RanRed01.tga" ), 0xffff00ff);
pTexRankRed[1] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "RanRed02.tga" ), 0xffff00ff);
pTexRankRed[2] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "RanRed03.tga" ), 0xffff00ff);
pTexRankPurple[0] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "RanPurple01.tga" ), 0xffff00ff);
pTexRankPurple[1] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "RanPurple02.tga" ), 0xffff00ff);
pTexRankPurple[2] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "RanPurple03.tga" ), 0xffff00ff);
pTexRankBlue[0] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "RanBlue01.tga" ), 0xffff00ff);
pTexRankBlue[1] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "RanBlue02.tga" ), 0xffff00ff);
pTexRankBlue[2] = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_THEME, "RanBlue03.tga" ), 0xffff00ff);
CWndStatic* pStatic = (CWndStatic*)GetDlgItem( WIDC_STATIC2 );
pStatic->SetTitle( "" );
CRect rect = m_pWndRoot->m_rectWindow;
int nWidth = m_rectWindow.Width();
int x = rect.left + (rect.Width() / 2) - (nWidth / 2);
Move( x, 5 );
}
BOOL CWndTargetInformation::OnEraseBkgnd( C2DRender* p2DRender )
{
return CWndBase::OnEraseBkgnd( p2DRender );
}
void CWndTargetInformation::SetWndRect( CRect rectWnd, BOOL bOnSize )
{
nHPWidth = -1;
nMPWidth = -1;
CWndNeuz::SetWndRect( rectWnd, bOnSize );
}
BOOL CWndTargetInformation::Initialize( CWndBase* pWndParent, DWORD )
{
BOOL bReturn = CWndNeuz::InitDialog( g_Neuz.GetSafeHwnd(), APP_TARGETINFORNATION, WBS_POPUP, NULL, pWndParent );
DelWndStyle( WBS_MOVE );
return bReturn;
}
Hier noch ein paar Fragen die sicherlich aufkommen werden.
Wie kann ich dass fenster bewegbar machen?
Die MP wird Falsch oder garnicht angezeigt?Quote:
Gehe in BOOL CWndTargetInformation::Initialize( CWndBase* pWndParent, DWORD ) und schmeiß die zeile DelWndStyle( WBS_MOVE ); raus.
Naja, ihr werdet dass schon schaffen.Quote:
Die Mana Punkte werden von den Servern einem Target nicht übermittelt, einfach es im Server hinzufügen. ![]()
Zu guter letzt, die Credits:
Wer fragen hat, oder sonstige Probleme mit dem einfügen darf er sich gerne per PN oder im Thread hier melden.Quote:
Crasy. ![]()
Ps: ich wäre dankbar wenn dies einer für unsere Englisch sprechenden leute übersetzen könnte, danke.
Mfg.






