Hi Leute,
ich Programmiere gerade eine Art Logger um die Texturen im Game in einer anderen Farbe darzustellen.
Das wird im Grunde eine Art Mod sein wo das Spiel Left for Dead einfach etwas lustiger wird
Naja, ich finde es persönlich zumindest ziemlich dunkel.
Der code soll später wie folgt funktionieren:
Dafür brauche ich warscheinlich einen Hook von MSDetours wurde mir in einem anderen Forum gesagt. Egal, zurück zum eigentlichen Problem da dies nur zeigen sollte
worum es geht.
Ich wollte nun eine Art Logger programmieren:
Pseudofunktional funktioniert er wie folgt:
- Du gehst ins Spiel und zielst mit der Mitte des Screens auf die Texture die du painten willst
- Du drückst numpad1 worauf hin ein scan gestartet wird
- Am anfang von DrawIndexedPrimitive holt sich die DLL die Farbe des Pixels in der mitte des Screens ( stellt die Orginalfarbe dar )
- Dann wird die Texture die gerade bemalt wurde mit der Pinken übermalt
- Anschließend am ende von DrawIndexedPrimtive hole ich mir dann nochmal die Farbe vom Pixel in der Mitte
- Wenn die Farben sich unterscheiden, wissen wir das unsere angepeilte Texture gerade durch DrawIndexedPrimitive bemalt wurde,
und wir loggen den Numvert, Primcount und StartIndex in eine datei.
Ich hole mir die Pixelfarbe wie folgt:
Das funktioniert zwar, aber ruft ein sehr großes Lag hervor, da der Screenbuffer ( Frontbuffer oder wie das heißt ), jedesmal neu Gelockt und GeUnlockt wird.
Gerade in DrawIndexedPrimtive, so ziemlicht die meist gecallte Funktion im Spiel, ist das nicht machtbar.
Kennt jemand ne Möglichkeit diese Values anderweitig zu loggen. Vielleicht bin ich ja auch auf dem Holzweg, oder bestenfalls die Farbe direct aus ner
Colormaske vom surface zu bekommen oder so?
Steh noch am Anfang von DirectX und verstehe nicht alles so gut, ich hoffe ihr könnt mir helfen da hier so viel Erfahrung rum klickt
Gruß aus Deutschland,
Frank
ich Programmiere gerade eine Art Logger um die Texturen im Game in einer anderen Farbe darzustellen.
Das wird im Grunde eine Art Mod sein wo das Spiel Left for Dead einfach etwas lustiger wird

Naja, ich finde es persönlich zumindest ziemlich dunkel.
Der code soll später wie folgt funktionieren:
Code:
#define Player ( ( ( Numvert == 1545 ) && ( startIndex = 1377 ) && ( primCount == 7568 ) ) ||\
( ( Numvert == 7567 ) && ( startIndex = 4687 ) && ( primCount == 4687 ) ) )
In IDirect3DDevice9::DrawIndexedPrimitive9:
HRESULT WINAPI hkDrawIndexedPrimitive( LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount ) {
if( Player ) {
pDevice->SetRenderState( D3DRS_ZENABLE, false );
pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
for( int i = 0; i < 6; i++ ) pDevice->SetTexture( i, g_pTexLightPink );
oDrawIndexedPrimitive( pDevice, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount );
pDevice->SetRenderState( D3DRS_ZENABLE, true );
pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
for( int i = 0; i < 6; i++ ) pDevice->SetTexture( i, g_pUltraPink );
}
}
Dafür brauche ich warscheinlich einen Hook von MSDetours wurde mir in einem anderen Forum gesagt. Egal, zurück zum eigentlichen Problem da dies nur zeigen sollte
worum es geht.
Ich wollte nun eine Art Logger programmieren:
Pseudofunktional funktioniert er wie folgt:
- Du gehst ins Spiel und zielst mit der Mitte des Screens auf die Texture die du painten willst
- Du drückst numpad1 worauf hin ein scan gestartet wird
- Am anfang von DrawIndexedPrimitive holt sich die DLL die Farbe des Pixels in der mitte des Screens ( stellt die Orginalfarbe dar )
- Dann wird die Texture die gerade bemalt wurde mit der Pinken übermalt
- Anschließend am ende von DrawIndexedPrimtive hole ich mir dann nochmal die Farbe vom Pixel in der Mitte
- Wenn die Farben sich unterscheiden, wissen wir das unsere angepeilte Texture gerade durch DrawIndexedPrimitive bemalt wurde,
und wir loggen den Numvert, Primcount und StartIndex in eine datei.
Ich hole mir die Pixelfarbe wie folgt:
Code:
class CColorHelper {
public:
int r;
int g;
int b;
DWORD rgb;
void fillStruct( int pixelX, int pixelY ) {
HDC hdc = GetDC( HWND_DESKTOP );
rgb = GetPixel( hdc, pixelX, pixelY );
r = GetRValue( rgb );
g = GetGValue( rgb );
b = GetBValue( rgb );
}
static bool match( CColorHelper* color1, CColorHelper* color2 ) {
if( color1->rgb == color2->rgb )
return true;
//do range scann
return false;
}
};
CColorHelper colorBefore;
CColorHelper colorAfter;
//So rufe ich es auf
colorBefore.fillStruct( (int)( g_ViewPort.Width / 2.f ), (int)( g_ViewPort.Height / 2.f ) );
Das funktioniert zwar, aber ruft ein sehr großes Lag hervor, da der Screenbuffer ( Frontbuffer oder wie das heißt ), jedesmal neu Gelockt und GeUnlockt wird.
Gerade in DrawIndexedPrimtive, so ziemlicht die meist gecallte Funktion im Spiel, ist das nicht machtbar.
Kennt jemand ne Möglichkeit diese Values anderweitig zu loggen. Vielleicht bin ich ja auch auf dem Holzweg, oder bestenfalls die Farbe direct aus ner
Colormaske vom surface zu bekommen oder so?
Steh noch am Anfang von DirectX und verstehe nicht alles so gut, ich hoffe ihr könnt mir helfen da hier so viel Erfahrung rum klickt

Gruß aus Deutschland,
Frank