Text in Diablo II ausgeben
Ich würde mit meinem delphi program gerne text direkt in diablo 2 ausgeben, leider find ich aber nicht raus wie.
Fenster schließen und so geht, aber wie text ausgeben? |
Re: Text in Diablo II ausgeben
Ich habe mich zu ähnlichen themen schon öfter geäußert ... es gibt 3 (akzepabele) methoden:
- Die einfachste methode ist immernoch, das spiel im fenster laufen zu lassen, und ein eigenes fenster daneben zu haben, das den text dann ausgibt (oder die dual-monitor lösung :mrgreen: ) - eine weitere einfache methode wäre einfach per textout auf den dc des d2 fensters zu 'schreiben'. Gekoppelt mit einem timer, oder einer schleife (wegen der aktualisierung des bildes, des frames) in der textout aufgerufen wird, ist das machbar. Dies ist eine recht simple methode, bei der der text aber stark flimmern kann. - die warscheinlich beste methode, aber auch schwerste methode wäre per hook die present (oder bei directx < 8 die flip) funktion abzufangen, und eigenen text auf dem backbuffer zu zeichnen, bevor front und backbuffer vertauscht werden (also ein neuer frame gezeichnet wird). soviel dazu ... ciao, Philipp |
Re: Text in Diablo II ausgeben
hmmm naja die dritte sieht mir wircklich am schönsten aus, gibst dafür paar beispielcodes etc....
hab erst mit dem ganzen angefangen... |
Re: Text in Diablo II ausgeben
Das 3. nennt sich DLL-Hooking, und erfordert im Grunde eine eigene DirectX-DLL, die alle auch nur erdenklichen Funktionen vom echten DirectX an die echte DLL weiterleitet, aber beim Flip noch eigenen Code ausführt.
Allerdings wird man wohl kaum eine detailierte Beschreibung aller Funktionen von DirectX finden, und selbst wenn, ist das ein rieeeeesen Aufwand. Das Programm FRAPS arbeitet in etwa so - und deswegen kostet es wohl auch etwas ;) Ich würde mich da auf Methode 2 beschränken. Ist zwar nicht wirklich schön, das Geflimmere dann, aber was soll's. gruss, dizzy |
Re: Text in Diablo II ausgeben
Drittere Methode müsste auch anders gehen.
Und zwar hängst du dich in den Prozess, am leichtesten per Hook. Danach sucht du die Speicheradresse der Flip-Funktion und biegst den Pointer auf eine eigene Funktion um. Zwar nicht ganz koscher aber funktioniert. Dieser Artikel beschreibt wie das ganze von statten geht. Viel Spass beim Prozess crashen :) Hoffe konnte helfen. |
Re: Text in Diablo II ausgeben
wie meinst du ueberhaupt ausgeben in DII?
willst du den text fuer dich sichtbar machen, oder so aufm schirm 'einblenden'? ahm, ich find du koenntest dir einfach in den clipboard den text schreiben und dann in D2 sobald du nen notification sound hoerst, vom programm ausgegben, einfach ne console auf und reinpasten, falls das funkt :P dann siehst den text auch hehe aber ich mach mich auch grad an die arbeit, zu sehen, wie das mitm speicherpointer umleiten funkt das waer cool :D |
Re: Text in Diablo II ausgeben
Zitat:
Man kann natürlich auch noch andere nette sachen damit machen, wie ich auf diesen 2 seiten präsentiert habe: Unreal Tournament - Texturlos Unreal Tournament - Tokara Forest mal anders Damit wollte ich nur zeigen ... es funktioniert! PS: Ich glaube ich muss in nächster zeit wirklich mal ein tutorial dazu schreiben ... obwohl ich das eigentlich nicht wollte ... denn jeder, der sich dafür _wirklich_ interessiert, braucht zwar ne weile, aber kommt drauf (und lernt verdammt viel dabei, so wars zumindest bei mir ...). :zwinker: ciao, Philipp |
Re: Text in Diablo II ausgeben
Zitat:
|
Re: Text in Diablo II ausgeben
Hi
Zitat:
Meine Meinung: abundzu muss ein sprung ins kalte wasser sein sonst lernt mans nie! MfG Boombuler |
Re: Text in Diablo II ausgeben
c113plpbr, genau das meinte ich.
Also wenn er genügend WinAPI Grundwissen hat, sehe ich nichts was dem Sprung im Wege steht. Den Artikel den ich gepostet habe bräuchte er nur Copy&Pasten und entsprechend modifizieren. Mehr nicht. |
Re: Text in Diablo II ausgeben
Zitat:
Zitat:
Ich würd dich :love: hoffnungsvoll, dizzy :) |
Re: Text in Diablo II ausgeben
Werde mir die ganzen Artikel mal zu Gemüte führen... Danke erstmal.
Werd schon sehen was dabei rauskommt. |
Re: Text in Diablo II ausgeben
Zitat:
grmph .. ich sollt erstmal den ganzen code lesen bevor ich fragen stelle.... danke. |
Re: Text in Diablo II ausgeben
Zitat:
@dizzy: Ja, äähm ... Fraps war ja ursprünglich nur dazu da, die framerate anzuzeigen ... sowas selber zu machen scheint mir kein allzu größes problem zu sein, aber von videocapturing hab ich null ahnung ... aber das kann sich natürlich ändern ... (ein beispiel, wie man ein video von seiner eigenen directx-anwendung erstellt (also ne szene aufnimmt) würde schon reichen ... ^^ ... ansonsten kann ich höchstens von jedem frame nen bmp-pic anbieten ...) Und ... sollte ich ein tutorial schreiben, wird das erstmal über function-hooking selbst gehen, und das unter verwendung von einer der oben genannten libs ... denn wer die grundlage nicht versteht, braucht sich mit den anderen spielchen garnicht erst auseinander zu setzen. (ich versuch mir in meiner letzten ferienwoche zeit dazu zu nehmen ... soweit ich da keine allzu großen zahnschmerzen hab ... ich werd morgn meine weisheitszähne los :pale: ) ciao, Philipp |
Re: Text in Diablo II ausgeben
Zitat:
Zitat:
Und wie gesagt: BMP's reichen zum capturen voll aus. Man muss nur schauen, dass die CPU nicht zu sehr drunter leidet. Zitat:
Zitat:
Werde mich auch schon mal etwas in das Thema einlesen, damit ich nachher nicht wie Ochs vorm Berg steh... cu, dizzy |
Re: Text in Diablo II ausgeben
Zitat:
Zitat:
... danke ... [bemerk]... das is alles ot ...[/bemerk] ciao, Philipp |
Re: Text in Diablo II ausgeben
Nur so aus Neugier... wird das ein Cheat fürs Battle.net?
|
Re: Text in Diablo II ausgeben
ok das program hab ich jetzt am laufen ... is ziemlich nice was das anstellt ;-)
Ich werd jetzt wohl suchen wie ich es modifizieren muss damit es für meine Zwecke taugt - nur mein problem ist, es ändert ja bestehende texte ab, ich muss aber text hinzufügen.... Und der code is wircklich groß, über weitere tipps betreffend dem code aus dem artikel bin ich dankbar. ps. Viel Glück beim Zahnarzt pps. Nein, Kein Cheat für bnet, ein Tool um z.b. Liedtitel ins Diablo zu schreiben (die gerade abspielt), IP etc. -> Wenn einer davon Ahnung hat und mit per Irc z.b. helfen könnte wäre ich natürlich auch nicht abgeneigt. Also wenn einer Uhrzeit und Datum nennt und mir etwas unter die Arme greifen kann und auch will, BITTE. Danke an die bisherige Hilfe, ist bis jetzt eine WIRCKLICHE (ohne Ironie) Hilfe gewesen! (Noch ein Problem: Das Program verändert alles in Windows, in Diablo sehen die Texte aber ganz normal aus (mein Winamp wird verändert, mein Delphi auch aber Diablo in sich selber is gleich geblieben, wieso?) |
Re: Text in Diablo II ausgeben
Zitat:
Diablo wird mit großer Sicherheit nicht die TextOut-Routine der WinAPI zur Textausgabe verwenden, sondern da es idR Bitmap-Fonts sind, DirectX-Zeichenroutinen. Da du aber ja selber etwas hinzufügen möchtest, so ist der jetzige Weg nicht sehr viel versprechend, da du immer nur rumfummeln kannst, wo schon etwas ist, und auch nicht in DirectX. Dafür brauchst du dann schon mindestens die "flickernde" Variante mit direktem Zeichnen auf ein das DC, oder eben das, was hoffentlich noch als Tutorial kommt ;) gruss, dizzy |
Re: Text in Diablo II ausgeben
Ich kenne mich d anicht so aus, aber Vidoes werden direkt in den Speicher der Grafikkarte "geschrieben". Siehe dazu den Mediaplayer. Da dürfte es keinen DC geben auf dem man was ausgeben kann. Wenn das DirectX jetzt auch so macht, dürftest du ein Problem haben.
|
Re: Text in Diablo II ausgeben
Naja weiß net inwiefern ihr Diablo kennt / spielt...
Einige kennen aber sicher das Program d2jsp (diablo 2 java script parser) - mit diesem kann man wie der name schon verrät javascript code ausführen welchen das program dann in diablo 2 umsetzt. Mit diesem wird in diablo was geschrieben, ohne problem, ohne flimmern.... einfach so... Also gehts irgendwie... (ich will NICHT d2jsp nachbauen!) Kann ich mithilfe von d2jsp evtl. herauskriegen wie's geht (also programm "zerlegen") |
Re: Text in Diablo II ausgeben
Am Rande: Hier schribt jemand, wie man einen Screenshot einer DirectX-Anwendung machen kann. Könnte man das nicht irgendwie verwursten? Hab das mal testweise in Delphi übersetzt (versucht) aber überhaupt nicht kompiliert bekommen, da mir wohl die DirectX 8.0 Header fehlen. Bis 7 hab ich sie, und da kennen die verwendeten Interfaces die ganzen Methoden die der Code benutzt nicht :?
Zum Thema "Zerlegen" hatten wir hier schon massig Diskussionen disassembler decompiler. Lies es, und du wirst sehen, dass man das getrost vergessen kann ;) |
Re: Text in Diablo II ausgeben
Die flackernde Variante ist schon möglich, da DirectX sowieso im Fenster läuft, welches ein DC hat, auf das man zeichnen kann (ich hab das selbst mal ausprobiert). Einfach per FindWindow sich ein fensterhandle holen, dann per GetDc den dc holen, und dann einfach per TextOut draufzeichnen. TextOut muss man dann in einer schleife recht oft aufrufen, um auf (möglichst) jeden frame den text zu zeichnen. Das funktioniert, aber wie gesagt, es flackert.
Um aber mit DirectX zu zeichnen, z.B. mit der DrawTextA funktion aus ID3DXFont braucht man zum erstellen der Font (bei dx9) ein IDirect3DDevice9. Ohne das, keine font. Und selbst dabei muss man auch noch im richtigen moment zeichnen, damit der text nicht wie bei obiger variante flackert. Daher ist API bzw. Function-Hooking die EINZIGE akzeptable methode (außer man versucht sich an einem Graphikkartentreiber). Ich hab mir nun vorgenommen das angesprochene Tutorial zu schreiben, und dies mit einem beispiel auszustatten, das zeigt, wie das möglich ist. Ihr müsst nur ein wenig gedult haben ... @dizzy: Genau den code hab ich verwendet, um screenshots zu machen ... allerdings ist der für eigene programme gedacht ... ^^ ciao, Philipp |
Re: Text in Diablo II ausgeben
Jo, das hört sich schon sehr konkret an ;-)
Ja, das mit dem zerlegen weiß ich das es net wircklich effizient ist (wenn ich es zerlegen und das zerlegte zu 100% verstehen könnte würde ich wohl diablo einfach neu schreiben ^^) Wie halt schon gesagt hab ich d2jsp und das hat auch eine dll, kann die diese nicht verwenden (copyright hab ich keine angst da es ja nur für mich + freundeskreis ist) ahja, btw. bei d2jsp sieht es aus als wenn die nachricht vom server käme, wäre es evtl. nicht möglich einfach eine für diablo fingierte message zu schicken, also gar nicht diablos grafik selbst zu manipulieren sondern einfach über den port wo "der text kommt" an sich selbst quasi eine nachricht zu schreiben? Diablo würde diese dann ganz normal ausgeben.... (is nur so ein einfall) Hier das mit dem DC .... geht nicht wircklich:
Delphi-Quellcode:
Das Program zeichnet immer auf sein eigenes Fenster anstatt auf notepad, den rechner oder diablo ...
procedure TForm1.FWin;
var W: HWnd; D: HDC; x: cardinal; begin W := FindWindow(NIL,'Diablo II'); if W<>0 then begin Status.Caption:='Fenster gefunden!'; status.Refresh; sleep(1000); x:=0; D := GetDeviceContext(W); while x < 150 do begin sleep(50); inc(x,1); TextOut(D,2,2,'FOUND',5); Status.Caption:='Output '+IntToStr(x); status.Refresh; end; Status.Caption:='Output done!'; status.Refresh; end else Status.Caption:='Fenster nicht gefunden'; status.Refresh; end; |
Re: Text in Diablo II ausgeben
Wenn ich sage GetDC, dann meine ich auch GetDC ... also, ersetze mal dein GetDeviceContext durch GetDC!
ciao, Philipp |
Re: Text in Diablo II ausgeben
jo hab es jetzt mit getdc und geht auch (die Hilfe schlug mir eben GetDeviceContext vor) ...
Aber die Möglichkeit dem Spiel eine Nachricht zu schicken wie als wenn Sie von dem Server käme wäre die nicht besser? Weil mit OutputText is wie ja schon vorher bemerkt sehr flimmernd... |
Re: Text in Diablo II ausgeben
Gibts denn keine Möglichkeit, einen Thread in den Diablo II Prozess zu "schummeln" und dann damit auf die D2 Libraries (d2client.dll, d2game.dll usw.) zuzugreifen? Du bräuchtest halt die Namen der Funktionen, aber ich schätze mal da wirst du in den Cheaterforen schon fündig...
btw: Bei FindWindow lieber nach dem Klassennamen "Diablo II" suchen anstatt des Fenstertitels |
Re: Text in Diablo II ausgeben
Zitat:
egal, ich bleibe bei meiner methode ... ^^ ... und wer keine gedult hat ist selbst schuld ... ciao, Philipp PS: :pale: mein mund ... AUUUAAA! :pale: |
Re: Text in Diablo II ausgeben
Zitat:
Wie such ich nach dem Klassennamen anstatt nach dem Fenstertitel? |
Re: Text in Diablo II ausgeben
Delphi-Quellcode:
W := FindWindow('Diablo II', nil);
|
Re: Text in Diablo II ausgeben
Ich habe eigentlich das selbe Problem:
Ich will in einem Spiel in das Textfenster strings ausgeben. Wenn ich das richtig verstanden habe, muss ich einen Hook programmieren um zusammen mit DirectX auf das Textfeld zuzugreifen. Hm, jetzt fällt mir gerade ein, dass das Spiel gar kein DirectX nutzt ;-) Das scheint doch eigentlich ein beliebtes Thema zu sein. Warum gibt 's dazu kein Tut. oder 'ne Seite, auf der das beschrieben steht bzw. Code-Vorlagen? :dance: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz