Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Seite 13 von 21 « Erste ... 269101112131415161720 ... Letzte »
Ergebnis 241 bis 260 von 404
  1. Homepage besuchen Beiträge anzeigen #241
    Clockwork Origins Avatar von Bonne6
    Registriert seit
    Jun 2004
    Ort
    Erlangen
    Beiträge
    11.826
     
    Bonne6 ist offline
    Zitat Zitat von orcwarriorPL Beitrag anzeigen
    Thanks again, you are a hero

    EDIT:
    Code:
    //==================================================
    // Trade_ChangeSellMultiplier
    // ----
    // - mul have to be zfloat value
    // - function should be refreshed atleast every trade 
    //   for simplify you can add it in ZS_TALK
    //==================================================
    func void Trade_ChangeSellMultiplier(var int mul)
    {
    	var int ptr;
    	ptr = MEMINT_oCInformationManager_Address;
    	ptr = MEM_ReadInt(ptr+24);//oCInformationManager.dlgTrade
    	ptr = MEM_ReadInt(ptr+260);	//dlgTrade.oCViewDialogItemContainer
    	MEM_WriteInt(ptr+268,mul);//oCViewDialogItemContainer.Multiplier = mul
    };
    
    //==================================================
    // Trade_ChangeBuyMultiplier
    // ----
    // - mul have to be zfloat value
    // - function should be refreshed atleast every trade 
    //   for simplify you can add it in ZS_TALK
    //==================================================
    func void Trade_ChangeBuyMultiplier(var int mul)
    {
    	var int ptr;
    	ptr = MEMINT_oCInformationManager_Address;
    	ptr = MEM_ReadInt(ptr+24);//oCInformationManager.dlgTrade
    	ptr = MEM_ReadInt(ptr+252);	//dlgTrade.oCViewDialogStealContainer
    	MEM_WriteInt(ptr+268,mul);//oCViewDialogStealContainer.Multiplier = mul	
    };
    Tested, works great.
    Seems not to work with Gothic 2, it crashes on the line

    MEM_WriteInt(ptr+268,mul);//oCViewDialogItemContainer.Multiplier = mul

    May be there is a wrong address for Gothic 2

  2. Homepage besuchen Beiträge anzeigen #242
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Zitat Zitat von Bonne6 Beitrag anzeigen
    Seems not to work with Gothic 2...
    ...which is not surprising. Gothic 2 uses a totally different trading system. There are no seperate supply and demand containers that are meant to be brought to equal value.

    To change the selling value, simply change TRADE_VALUE_MULTIPLIER in Constants.d.

    If you need to change it dynamically, its more complicated. The following code (for Gothic 2) changes the Value Multiplier in two places, one being responsible for the display of the correct value to the player and the other one being responsible for giving him the correct amount of gold on selling.

    Code:
    const int trade_Value_multiplier_ptr = 11211032; //0xAB1118
    func void SetSellingValuePercent (var int percent) {
        //int to float:
        percent = divf (mkf (percent), mkf (100));
        MEM_WriteInt (trade_Value_multiplier_ptr, percent);
        
        /* This line does basically the following:
            MEM_InformationMan -> DlgTrade -> DlgInventoryNpc -> ValueMultiplier = percent; */
        MEM_WriteInt (MEM_ReadInt(MEM_InformationMan.DlgTrade + 248/*0xF8*/) + 268 /*0x10C*/, percent);
    };
    Sorry for being to lazy to get an entire class definition. The relevant classes are pretty big in size.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  3. Homepage besuchen Beiträge anzeigen #243
    Clockwork Origins Avatar von Bonne6
    Registriert seit
    Jun 2004
    Ort
    Erlangen
    Beiträge
    11.826
     
    Bonne6 ist offline
    Ah, super, werde ich gleich mal testen Und ja, soll dynamisch sein, sonst bringt das ja nichts

    EDIT: Funzt einwandfrei (so auf den ersten Blick), viel Dank
    Geändert von Bonne6 (28.12.2010 um 14:20 Uhr)

  4. Beiträge anzeigen #244
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Ich habe auch noch zwei Fragen:

    1) Möglichst alles ausblenden (Status, Bars,...)
    Bei oCGame habe ich gefunden:
    Code:
        var int game_text;              //zCView*                           
        var int load_screen;            //zCView*                           
        var int save_screen;            //zCView*                           
        var int pause_screen;           //zCView*                           
        var int hpBar;                  //oCViewStatusBar*        
        var int swimBar;                //oCViewStatusBar*        
        var int manaBar;                //oCViewStatusBar*        
        var int focusBar;               //oCViewStatusBar*        
        var int showPlayerStatus;       //zBOOL
    Was ist dort was?
    game_text z.B. Fokusname?
    showPlayerStatus der Statusbildschirm?
    Was ist pause_screen?
    Wie sorge ich dafür, dass z.B. eine Bar nicht mehr angezeigt wird?

    2) Ich möchte die Zeit schneller verstreichen lassen. Eine Variante sekündlich mit Wld_SetTime zu arbeiten ist unschön, da Npc dann immer wieder neu in ihren TA versetzt werden. Aber da lässt sich doch sicher was mit Ikarus machen, oder?
    Auch oCGame:
    Code:
        // Timer
        var int wldTimer;               //oCWorldTimer*                 
        var int timeStep;               //zREAL                               // Ermöglicht Einzelbildschaltung
        var int singleStep;             //zBOOL
    Ich würde mal raten, dass timeStep dafür gedacht ist, aber wie benutze ich das?


    Und allgemein zu Ikarus: Muss ich Änderungen nach jedem Laden nochmal ausführen, da sie wieder überschrieben werden?

  5. Homepage besuchen Beiträge anzeigen #245
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    @Milky:
    1.) Wenn dir der Effekt von "toggle desktop" reicht, genügt es MEM_Game.game_drawall = false
    zu setzen.

    2.) Ich hab mal etwas herumprobiert, an die TicksPerHour Konstante kommt man leider nicht ran, weil sie in einem schreibgeschützten Speicherbereich steht, aber was bei mir ziemlich problemlos ging war jeden Frame die Zeit ein bisschen zu justieren.

    Code:
    func void ScaleWorldTime (var int factor) {
        //worldTime += frameTime * (factor - 1);
    
        //Global instances have to be intialised!
        var int deltaT; deltaT = MEM_Timer.frameTimeFloat;
        deltaT = mulf (deltaT, subf (factor, mkf (1)));
        
        MEM_WorldTimer.worldTime = addf (MEM_WorldTimer.worldTime, deltaT);
    };
    Ein Aufruf von ScaleWorldTime (mkf (10)); jeden Frame hat bei mir die Zeit 10 mal schneller verstreichen lassen. ScaleWorldTime (invf(mkf(10))); hat auch funktionert und die Zeit ist 10 mal langsamer verstrichen.
    Sei dir aber bewusst, dass die Zeit so in jedem Frame erst vorwärts läuft und dann ein Stück rückwärts (falls factor < 1).
    Sensible Systeme, die mehrmals in einem Frame aktiv sind und sich darauf verlassen, dass die Zeit niemals rückwärts läuft könnten merkwürdiges Verhalten zeigen. Wie groß die Gefahr wirklich ist muss man testen. Ich halte Probleme allerdings für unwahrscheinlich, schon allein, weil Triggerschleifen beinahe ausnahmslos am Ende des Frames aktiv sind.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  6. Beiträge anzeigen #246
    Ehrengarde Avatar von Gottfried
    Registriert seit
    Mar 2006
    Beiträge
    2.512
     
    Gottfried ist offline
    Zitat Zitat von Sektenspinner Beitrag anzeigen
    Es gibt zCVob.groundPoly, was relativ zuverlässig das Polygon unter dem Vob enthält. Das könnte dir helfen. Allerdings wird zCVob.groundPoly wohl nicht spontan aktualisiert sondern vermutlich nur, wenn die Engine das Vob irgendwie bewegt.
    Ansonsten selbst im BspTree rumsuchen und Kollisionserkennung zu machen halte ich für sehr schwierig und sehr aufwändig. Du könntest die RayTracing Methode der Engine höchstens selbst aufrufen. Das hat aber auch noch keiner gemacht, das heißt man muss erstmal rausfinden, wie die Parameter sind und wie das Ergebnis aussieht. Was genau willst du tun?
    Das klingt schonmal ganz gut.. Mit dem Groundpoly werde ich mal ein bisschen rumexperimentieren
    Was ich machen möchte? Am liebsten ein paar Vobs durch die Gegend werfen und sie dabei zB. an Wänden abprallen lassen.. Eventuell könnte man da auch was mit dem RigidBody anfangen, damit hab ich mich aber noch nicht wirklich auseinandergesetzt..

    Edit: Danke für den Tipp mit dem Sinus, das funktioniert bestens

    MfG Gottfried

  7. Beiträge anzeigen #247
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Zitat Zitat von Sektenspinner Beitrag anzeigen
    @Milky:
    1.) Wenn dir der Effekt von "toggle desktop" reicht, genügt es MEM_Game.game_drawall = false
    zu setzen.
    Das muss ich mir mal anschauen, vermutlich reicht es schon vollkommen.

    2.) Ich hab mal etwas herumprobiert, an die TicksPerHour Konstante kommt man leider nicht ran, weil sie in einem schreibgeschützten Speicherbereich steht, aber was bei mir ziemlich problemlos ging war jeden Frame die Zeit ein bisschen zu justieren.

    Code:
    func void ScaleWorldTime (var int factor) {
        //worldTime += frameTime * (factor - 1);
    
        //Global instances have to be intialised!
        var int deltaT; deltaT = MEM_Timer.frameTimeFloat;
        deltaT = mulf (deltaT, subf (factor, mkf (1)));
        
        MEM_WorldTimer.worldTime = addf (MEM_WorldTimer.worldTime, deltaT);
    };
    Ein Aufruf von ScaleWorldTime (mkf (10)); jeden Frame hat bei mir die Zeit 10 mal schneller verstreichen lassen. ScaleWorldTime (invf(mkf(10))); hat auch funktionert und die Zeit ist 10 mal langsamer verstrichen.
    Sei dir aber bewusst, dass die Zeit so in jedem Frame erst vorwärts läuft und dann ein Stück rückwärts (falls factor < 1).
    Sensible Systeme, die mehrmals in einem Frame aktiv sind und sich darauf verlassen, dass die Zeit niemals rückwärts läuft könnten merkwürdiges Verhalten zeigen. Wie groß die Gefahr wirklich ist muss man testen. Ich halte Probleme allerdings für unwahrscheinlich, schon allein, weil Triggerschleifen beinahe ausnahmslos am Ende des Frames aktiv sind.
    Für einen Trigger, der jede Sekunde feuert hast du ja hier etwas geschrieben:
    http://forum.worldofplayers.de/forum...&#post12431128
    Habe ich das Skript richtig verstanden, dass der fireDelay meines Triggers egal ist, da das "nächste Aufrufen" mit der aktuellen Zeit überschrieben wird?
    Dann zur Zeit selbst: ScaleWorldTime (2); wäre dann doppelt so schnell. Wie bekomme ich etwas wie z.B. ScaleWorldTime (1.5) hin?
    Würde ein Aufruf mit ScaleWordTime (3); funktionieren, wenn ich es so anpasse:
    Code:
    subf (factor/2, mkf (1))
    oder würde dabei dann 3/2=1.5=1 gerechnet und somit nicht das gewünschte Ergebnis?
    Was mich an der Stelle noch wundert:
    Wieso muss aus der 1 noch ein float gemacht werden und aus "factor" nicht?
    (dein Float-Paket ist wohl Voraussetzung, habe ich auch schon)

  8. Homepage besuchen Beiträge anzeigen #248
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Zitat Zitat von Milky Way
    Für einen Trigger, der jede Sekunde feuert hast du ja hier etwas geschrieben:
    http://forum.worldofplayers.de/forum...&#post12431128
    Habe ich das Skript richtig verstanden, dass der fireDelay meines Triggers egal ist, da das "nächste Aufrufen" mit der aktuellen Zeit überschrieben wird?
    Korrekt.

    Zitat Zitat von Milky Way
    Dann zur Zeit selbst: ScaleWorldTime (2); wäre dann doppelt so schnell. Wie bekomme ich etwas wie z.B. ScaleWorldTime (1.5) hin?
    Vorsicht. ScaleWorldTime erwartet eine Zahl in Gleitkommadarstellung.
    ScaleWorldTime(2) ist Unsinn, da eine gewöhnliche Ganzzahl 2 (also 0x00000002) als Gleitkommazahl interpretiert etwas völlig anderes als 2.0 bedeutet.

    Um die Zeit doppelt so schnell laufen zu lassen kannst du nutzen:
    Code:
    ScaleWorldTime(mkf (2));
    mkf ist dabei eine Funktion aus meinem Floatpaket die eine Ganzzahl in natürlicher Kodierung in eine Gleitkommadarstellung überführt.

    Die Zeit um den Faktor 1.5 zu beschleunigen geht, indem du divf(mkf(3),mkf(2)) einsetzt, in diesem Ausdruck wird die Gleitkommazahl 3 durch die Gleitkommazahl 2 geteilt. Das Ergebnis ist die Gleitkommazahl 1.5, mit der ScaleWorldTime arbeiten kann.

    Zitat Zitat von Milky Way
    Wieso muss aus der 1 noch ein float gemacht werden und aus "factor" nicht?
    (dein Float-Paket ist wohl Voraussetzung, habe ich auch schon)
    factor soll bereits als Float eingesetzt werden (siehe oben).

    Zitat Zitat von Milky Way
    Code:
    subf (factor/2, mkf (1))
    Die "/" Operation ist für Ganzzahlen vorgesehen und trägt für Zahlen in Gleitkommadarstellung keine sinnvolle Bedeutung. Weil factor eine Gleitkommazahl sein soll (und subf auch eine Gleitkommazahl als Parameter erwartet), kommt das also nicht in Frage.

    Ich hoffe es ist etwas klarer geworden wie die Funktion zu benutzen ist.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  9. Homepage besuchen Beiträge anzeigen #249
    Adventurer Avatar von orcwarriorPL
    Registriert seit
    Jan 2006
    Ort
    themodders.org
    Beiträge
    79
     
    orcwarriorPL ist offline
    Zitat Zitat von Sektenspinner Beitrag anzeigen
    Sorry for being to lazy to get an entire class definition. The relevant classes are pretty big in size.
    Still thanks, I think multipliers of sell/buy was most useful part of it.
    But I've got another idea linked with these classes, can I Simply get *oCItem of selected now item? Right now, I think I need only hero container selected item (if selected items are for every one container).

    I Founded function that probably is responsible for it:
    oCViewDialogTrade::OnTransferLeft(void) (line 0x732AC0)
    if transform means move from container to another it sure need to know what item is selected right now.

    Code:
    mov     ecx, [esi+0FCh]
    call    ?RemoveSelectedItem@oCViewDialogItemContainer@@QAIPAVoCItem@@XZ ; oCViewDialogItemContainer::RemoveSelectedItem(void)
    Looks like the adress of oCViewDialogItemContainer (hero) is collected in ecx, and later oCViewDialogItemContainer::RemoveSelectedItem was called.
    It's similar to function that Sektenspinner analyze, so *oCItem is stored in edi. atleast before call of GetItemValue.
    So lets move to this function:

    line (0x72FFC0)
    Code:
    ; public: class oCItem * __fastcall oCViewDialogItemContainer::RemoveSelectedItem(void)
    ?RemoveSelectedItem@oCViewDialogItemContainer@@QAIPAVoCItem@@XZ proc near
    
    var_10= dword ptr -10h
    var_C= dword ptr -0Ch
    
    sub     esp, 8
    push    esi
    mov     esi, ecx
    mov     ecx, [esi+100h]
    test    ecx, ecx
    jnz     short loc_72FFD7
    
    loc_72FFD7:
    mov     eax, [ecx]
    push    edi
    call    dword ptr [eax+3Ch]
    mov     ecx, [esi+100h]
    mov     edx, [ecx]
    push    1
    push    eax
    call    dword ptr [edx+34h]
    mov     edi, eax
    test    edi, edi
    jz      short loc_730051
    
    mov     eax, [edi+314h] ; edi=item*
    mov     ecx, edi
    mov     [esp+0Ch], eax
    call    ?GetValue@oCItem@@QAEHXZ ; oCItem::GetValue(void)
    [...]
    Sorry for making trouble again

  10. Beiträge anzeigen #250
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Zitat Zitat von Sektenspinner Beitrag anzeigen
    @Milky:
    1.) Wenn dir der Effekt von "toggle desktop" reicht, genügt es MEM_Game.game_drawall = false
    zu setzen.
    toggle desktop ist mir eigentlich schon zu extrem, die Fokusnamen bräuchte ich schon noch. Lässt sich da relativ einfach was machen? Ich könnte zwar im Prinzip auch die Bar-Texturen transparent machen, aber ich würde gerne den Spieler einstellen lassen, ob er was sieht oder nicht. Kann ich die Bars mit Ikarus beeinflussen? (Status ist mir eigentlich egal).
    Wobei ich das natürlich auch andersherum machen könnte und den Fokus wieder von Hand printen lassen könnte, oder?
    Oder siehst du da direkt erstmal ein Problem? Ich würde sekündlich mit einem Trigger den Fokus des Spielers erfassen und dann den Namen printen.
    Kann ich dazu den Fokus (egal, ob Npc, Vob oder Mob) als zCVob behandeln?
    (und dann über hero.focus_vob.name (natürlich nicht genau so) an den Fokusnamen kommen?)


    Zitat Zitat von Sektenspinner Beitrag anzeigen
    Vorsicht. ScaleWorldTime erwartet eine Zahl in Gleitkommadarstellung. [...]
    Ich hoffe es ist etwas klarer geworden wie die Funktion zu benutzen ist.
    Ah, so ist das gedacht. Ich hatte mich ja schon gewundert, dass factor nicht mehr zu einem float gemacht wird, aber so ergibt es einen Sinn. Getestet und funktioniert.
    Einen komischen Fehler hatte ich erst noch:
    Wieso kommt bei mkf(100/60) etwas ganz großes raus? (Zeit verlief sehr schnell)
    Ich hätte eigentlich erwartet, dass es dann identisch zu mkf(1) würde...
    ( es funktioniert natürlich richtig mit divf(mkf(100), mkf(60)) )

  11. Homepage besuchen Beiträge anzeigen #251
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    The relevant part is this:

    Code:
    ; public: class oCItem * __fastcall oCViewDialogItemContainer::RemoveSelectedItem(void)
    ?RemoveSelectedItem@oCViewDialogItemContainer@@QAIPAVoCItem@@XZ proc near
    
    mov     esi, ecx
    mov     ecx, [esi+100h]
    mov     edx, [ecx]
    call    dword ptr [edx+34h]
    mov     edi, eax
    mov     ecx, edi
    call    ?GetValue@oCItem@@QAEHXZ ; oCItem::GetValue(void)
    oCViewDialogItemContainer esi = this
    oCItemContainer ecx = esi.ItemContainer
    edx is set to the virtual Method Table of oCItemContainer
    The call to [edx + 34] is calling the virtual function oCItemContainer :: GetSelectedItem on ecx
    the result is the selected item and moved to ecx.

    Long story short: oCViewDialogItemContainer has an underlying oCItemContainer with an offset of 0x100.
    If you dig further into oCItemContainer.GetSelectedItem you'll find that this oCItemContainer has a list of items and knows the index of the selected item in the list (and iterates through it to get the pointer).

    @Milky: Eine einfache Lösung ist mir nicht bekannt.

    Zitat Zitat von Milky
    Ich könnte zwar im Prinzip auch die Bar-Texturen transparent machen, aber ich würde gerne den Spieler einstellen lassen, ob er was sieht oder nicht. Kann ich die Bars mit Ikarus beeinflussen?
    Ja. In oCGame (also der Klasse, der MEM_Game angehört) findest du die ganzen Bars. Sie sind vom Typ oCViewStatusBar und der ist dokumentiert. Da gibts vermutlich verschiedene Möglichkeiten ihn unsichtbar zu machen, die einfachste wird wohl sein ihn aus dem Bildschirm heraus zu bewegen.

    Zitat Zitat von Milky
    Wobei ich das natürlich auch andersherum machen könnte und den Fokus wieder von Hand printen lassen könnte, oder?
    Nein, wenn game_DrawAll nicht gesetzt ist, werden alle 2D-Objekte auf dem Bildschirm nicht gezeichnet. Auch Text den du versuchst zu Printen.

    Zitat Zitat von Milky
    Kann ich dazu den Fokus (egal, ob Npc, Vob oder Mob) als zCVob behandeln?
    (und dann über hero.focus_vob.name (natürlich nicht genau so) an den Fokusnamen kommen?)
    Ja und nein. oCNpc, oCMob sind auch zCVobs, aber aus den zCVob Eigenschaften kriegst du nicht den Fokusnamen heraus. Der liegt in den Npc Eigenschaften bzw. den Mob Eigenschaften. Du kannst herausfinden welcher Unterklasse von zCVob dein Vob angehört, indem du die "Hlp_Is_" Funktionen aus Ikarus benutzt.

    Zitat Zitat von Milky
    Ah, so ist das gedacht. Ich hatte mich ja schon gewundert, dass factor nicht mehr zu einem float gemacht wird, aber so ergibt es einen Sinn. Getestet und funktioniert.
    Einen komischen Fehler hatte ich erst noch:
    Wieso kommt bei mkf(100/60) etwas ganz großes raus? (Zeit verlief sehr schnell)
    Ich hätte eigentlich erwartet, dass es dann identisch zu mkf(1) würde...
    ( es funktioniert natürlich richtig mit divf(mkf(100), mkf(60)) )
    Ich habs grade nochmal getestet und meine Testergebnisse decken sich mit deiner Vermutung, nicht mit deiner Beobachtung. Und so sollte es auch sein.
    Vielleicht irgendwas vergessen zu parsen oder zu speichern?
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  12. Beiträge anzeigen #252
    Ehrengarde Avatar von Gottfried
    Registriert seit
    Mar 2006
    Beiträge
    2.512
     
    Gottfried ist offline
    Mal wieder etwas besonders geistreiches von meiner Seite
    Code:
    /* === MessageBox === */
    /* Wirft eine MessageBox mit 'text' als
     * Inhalt. text beschränkt sich hierbei
     * auf 51 Zeichen */
    
    func void MessageBox(var string text) {
        var int len; len = STR_Len(text);
        if(len>51) {
            len = 51;
        };
        var int ptr; ptr = STRINT_ToChar(text);
        MEM_CopyBytes(ptr, 9074940, len);
        MEM_WriteInt(9074924, 0);
        MEM_WriteInt(9074908, 0);
        MEM_WriteInt(9074940+len, MEM_ReadInt(9074940 + len)&~255);
        Wld_InsertObject(" '", "TOT");
    };
    Ich versuche mich jetzt mal ein wenig mit IDA anzufreunden und habe deswegen mal aus Spaß ein paar Addressen herausgesucht und versucht irgendwie zu verwenden.. Meine erste Idee war den bösen Cheatern eins reinzuwürgen und was wäre da besser geeignet als eine Messagebox
    Einziges Problem: Das 'oCMob' am Ende des Textes.. Das scheint nicht als String in der Gothic2.exe verzeichnet zu sein, aber vielleicht finde ich noch einen erzeugbaren Error ohne dieses

    MfG Gottfried

  13. Homepage besuchen Beiträge anzeigen #253
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    @Gottfried: Nette Idee. Vielleicht ists aber leichter die vorhandene MessageBoxA Funktion an 0x007B48E8 zu verwenden. Scheint die hier zu sein.
    Mit dem Call-Skript (das ich mal finalisieren und in Ikarus integrieren sollte), dürfte das nicht weiter problematisch sein (man muss halt die Parameter pushen), und man ist flexibler und kann sich sogar ja/nein Rückgabewerte geben lassen.
    Inwieweit das allerdings fürs Spiel geeignet ist, ist fraglich, weil sich Vollbildmodus und Messageboxen eben nicht gut vertragen.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  14. Beiträge anzeigen #254
    Ehrengarde Avatar von Gottfried
    Registriert seit
    Mar 2006
    Beiträge
    2.512
     
    Gottfried ist offline
    Zitat Zitat von Sektenspinner Beitrag anzeigen
    @Gottfried: Nette Idee. Vielleicht ists aber leichter die vorhandene MessageBoxA Funktion an 0x007B48E8 zu verwenden. Scheint die hier zu sein.
    Mit dem Call-Skript (das ich mal finalisieren und in Ikarus integrieren sollte), dürfte das nicht weiter problematisch sein (man muss halt die Parameter pushen), und man ist flexibler und kann sich sogar ja/nein Rückgabewerte geben lassen.
    Inwieweit das allerdings fürs Spiel geeignet ist, ist fraglich, weil sich Vollbildmodus und Messageboxen eben nicht gut vertragen.
    Klar, das sieht auf jeden Fall schöner zu Handhaben aus
    Das mit dem Pushen kann man ja auch sauber in eine Funktion verpacken, dann störts keinen mehr.
    Nur dass ich das richtig verstanden habe: Mit diesem "Call-Skript" wird es möglich sein Enginefunktionen aufzurufen und auch Rückgabewerte zu erhalten?

    MfG Gottfried

  15. Homepage besuchen Beiträge anzeigen #255
    Adventurer Avatar von orcwarriorPL
    Registriert seit
    Jan 2006
    Ort
    themodders.org
    Beiträge
    79
     
    orcwarriorPL ist offline
    Thanks Sektenspinner, I don't found how to get that selected weapon *oCItem, i searched 0x04 list but It looked like a list of all hero/trader items (there was items on exchange too) but I found offset of selected item at 0x0C in oCItemContainer and zCView of Category name at 0x30 (at 0xC8 there is a string of cat. name) It was enough, but I found out an error when I was dynamical changed multipiler of sell/buy. I'm not trully sure of the reason of this bug but it looks like gothic don't reset value after trade but just substract every item.value*multipiller of value of all items. I think reseting of this value before every trade should be enough to solve that error.

    EDIT:
    If somebody need, these value are in:

    Hero exchange value: oCInformationManager=>ocViewDialogTrade=>oCViewDialogItemContainer=>value
    oCInformationManager=>0x018=>0x104=>0x108

    Trader exchange value: oCInformationManager=>ocViewDialogTrade=>oCViewDialogStealContainer=>value
    oCInformationManager=>0x018=>0x0FC=>0x108
    Geändert von orcwarriorPL (29.12.2010 um 15:56 Uhr)

  16. Homepage besuchen Beiträge anzeigen #256
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline

    Neue Version

    Eine neue Version von Ikarus ist verfügbar (1.1).

    Changelog 1.0 -> 1.1
    Code:
    "ASM_" Funktionen um Maschinencode zu diktieren und auszuführen.
    Darauf aufbauend "CALL_" Funktionen, die es erleichtern Engine Funktionen auszuführen.
    MEM_MessageBox und MEM_InfoBox hinzugefügt.
    MEM_InsertVob hinzugefügt (danke an Gottfried!).
    Konstante GOTHIC_BASE_VERSION eingeführt. Sie ist 1 in Ikarus_Const_G1.d und 2 in Ikarus_Const_G2.d. Dies erleichtert es Code zu schreiben, der auf beiden Plattformen läuft.
    Detaiiertere Informationen gibts in der Doku. Was ich hier schonmal posten kann ist die neue Funktion MEM_MessageBox, an ihr erkennt man einigermaßen wie der Aufruf von Engine Funktionen mit den "CALL_" Funktionen funktioniert.
    Code:
    func int MEM_MessageBox (var string txt, var string caption, var int type) {
        /* Hier liegt die MessageBox Funktion */
        const int WinAPI__MessageBox = 8079592; //0x7B48E8
        
        /* Parameter in umgekehrter Reihenfolge */
        CALL_IntParam (type);           // int
        CALL_cStringPtrParam (caption); // char **
        CALL_cStringPtrParam (txt);     // char **
        CALL_PtrParam (0);              // owner Window; darf Null sein
        
        /* als __stdcall ausführen */
        CALL__stdcall (WinAPI__MessageBox);
        
        return CALL_RetValAsInt();
    };
    Mit den Callskripten eröffnen sich nun eine ganze Menge Möglichkeiten die es vorher nicht gab.
    Ich habe einige Beispiele in Ikarus_Doc.d aufgenommen, ich hoffe sie sind ausreichend.

    @orcwarriorPL: I'll look into it. But not this year any more.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  17. Beiträge anzeigen #257
    Ehrengarde Avatar von Gottfried
    Registriert seit
    Mar 2006
    Beiträge
    2.512
     
    Gottfried ist offline
    Zitat Zitat von Sektenspinner Beitrag anzeigen
    Eine neue Version von Ikarus ist verfügbar (1.1).
    Vielen Dank dafür
    Das mit den Enginefunktionen funktioniert super, hab mir gleich mal die zCVob::RotateWorldY geholt.. Spitze
    Und nun verschwinde ich und feier Neujahr. Frohes Neues an alle

    MfG Gottfried

  18. Homepage besuchen Beiträge anzeigen #258
    Clockwork Origins Avatar von Bonne6
    Registriert seit
    Jun 2004
    Ort
    Erlangen
    Beiträge
    11.826
     
    Bonne6 ist offline
    Eine Frage zu den Call-Sachen:

    Ich hab von der alten Version Code drin, der jetzt nicht mehr passt, weil du Funktionen umbenannt hast.

    Aus der CALL_PushIntParam müsste die CALL_IntParam geworden sein, aber was ist mit der CALL_Init? Braucht's die jetzt nicht mehr, wird das also mit dem restlichen Ikarus-Zeug initialisiert?

  19. Homepage besuchen Beiträge anzeigen #259
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Zitat Zitat von Bonne6 Beitrag anzeigen
    Ich hab von der alten Version Code drin, der jetzt nicht mehr passt, weil du Funktionen umbenannt hast.
    Jup. :-/
    Wirst das wohl umstellen müssen.
    Ich könnte jetzt versuchen mich rausreden und sagen, dass es ja noch gar nicht offizieller Teil von Ikarus war... Aber ändert natürlich nichts daran, dass Zeug umbenennen was blödes ist.

    Die alte CALL_Init Funktion ist rausgeflogen, sie war nicht mehr nötig. Das "Push" in den Funktionennamen habe ich weggelassen, weil es eigentlich unnötige Schreibarbeit ist und Namen wie CALL_cStringPtrParam sowieso schon sehr lang sind.

    Ein Report von Bugs und Unklarheiten ist wie immer willkommen, weder die Funktionen noch der neue Teil der Doku sind bis in jedes Detail getestet. Wäre auch gut zu wissen, wenn es fehlende Funktionalität gibt, die noch gemacht werden sollte. __cdecl ist mir bislang nicht wirklich über den Weg gelaufen, andere Arten von Parametern und Rückgabewerten auch nicht.

    Wer eine Idee hat, wie man möglichst viele Engine Funktionen möglichst automatisiert möglichst übersichtlich nutzbar machen kann, ist auch willkommen sich einzubringen. Wäre schon schön einfach eine Datei zu haben, in der für sehr viele Enginefunktionene eine Daedalusfunktion steht, die sie kapselt, sodass man sich die manuelle Kapselung spart.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts
    Geändert von Sektenspinner (01.01.2011 um 02:04 Uhr)

  20. Homepage besuchen Beiträge anzeigen #260
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Mit den Call-Skripten und
    LoadLibrary
    GetProcAddress
    und der dadurch greifbar gewordenen Funktion VirtualProtect

    ist es mir gelungen in Speicherbereiche zu schreiben, in denen dies vorher nicht erlaubt war. Insbesondere kann so im .rdata (read Only data) und im .text (Programmcode) Segment geschrieben werden.

    Der Code den ich dazu geschrieben habe ist folgender:
    Code:
    //#################################################
    //
    //    Auf Ikarus aufbauend: Weitere Funktionen
    //
    //#################################################
    
    //*****************************************
    //   Funktionen aus anderen DLLs laden
    //*****************************************
    
    /*  http://msdn.microsoft.com/en-us/library/ms684175%28v=vs.85%29.aspx */
    func int LoadLibrary (var string lpFileName) {
        var int WinAPI__LoadLibrary;
        if (GOTHIC_BASE_VERSION == 2) {
            WinAPI__LoadLibrary = MEM_ReadInt (8577604); //0x82E244
        } else {
            WinAPI__LoadLibrary = MEM_ReadInt (8192588); //0x7D024C
        };
        
        CALL_cStringPtrParam (lpFileName);
        CALL__stdcall (WinAPI__LoadLibrary);
        return CALL_RetValAsPtr();
    };
    
    /* http://msdn.microsoft.com/en-us/library/ms683212%28v=vs.85%29.aspx */
    func int GetProcAddress (var int hModule, var string lpProcName) {
        var int WinAPI__GetProcAddress;
        if (GOTHIC_BASE_VERSION == 2) {
            WinAPI__GetProcAddress = MEM_ReadInt (8577688); //0x82E298
        } else {
            WinAPI__GetProcAddress = MEM_ReadInt (8192260); //0x7D0104
        };
        
        CALL_cStringPtrParam (lpProcName);
        CALL_PtrParam (hModule);
        CALL__stdcall (WinAPI__GetProcAddress);
        
        return CALL_RetValAsPtr();
    };
    
    //einfache Anwendung der obigen beiden Funktionen.
    func int FindKernelDllFunction (var string name) {
        return GetProcAddress (LoadLibrary ("KERNEL32.DLL"), name);
    };
    
    //*****************************************
    //   Schreibschutz umgehen
    //*****************************************
    
    const int PAGE_EXECUTE = 16; //0x10
    const int PAGE_EXECUTE_READ = 32; //0x20
    const int PAGE_EXECUTE_READWRITE = 64; //0x40
    const int PAGE_EXECUTE_WRITECOPY = 128; //0x80
    
    const int PAGE_NOACCESS = 1; //0x01
    const int PAGE_READONLY = 2; //0x02
    const int PAGE_READWRITE = 4; //0x04
    const int PAGE_WRITECOPY = 8; //0x08
    
    /* http://msdn.microsoft.com/en-us/library/aa366898%28VS.85%29.aspx */
    /* Note: I made lpflOldProtectPtr the return value and ignored
     * the return Value of VirtualProtect */
    func int VirtualProtect (var int lpAddress, var int dwSize, var int flNewProtect) {
        var int adr;
        adr = FindKernelDllFunction ("VirtualProtect");
        
        var int lpflOldProtectPtr;
        lpflOldProtectPtr = MEM_Alloc (4);
        
        CALL_PtrParam (lpflOldProtectPtr);
        CALL_IntParam (flNewProtect);
        CALL_IntParam (dwSize);
        CALL_PtrParam (lpAddress);
        
        CALL__stdcall (adr);
        
        var int res; res = MEM_ReadInt (lpflOldProtectPtr);
        MEM_Free (lpflOldProtectPtr);
        
        return res;
    };
    
    func void MemoryProtectionOverride (var int address, var int size) {
        var int resDump;
        resDump = VirtualProtect (address, size, PAGE_EXECUTE_READWRITE);
    };
    Eine mögliche Anwendung wäre zum Beispiel die Drehgeschwindigkeit des Helden zu verändern, sie steht im .rdata Segment:
    Code:
    {
        const int HeroTurnSpeedAdr = 8581936; /*0x82F330*/
        MemoryProtectionOverride (HeroTurnSpeedAdr, 4); //4 bytes
        MEM_WriteInt (HeroTurnSpeedAdr, FLOATEINS); //_very_ fast.
    }
    Eine lange gehegten Wunsch, den ich mir erfüllt habe, ist es diesen blöden Fehler zu beheben, dass die Drehung von Npcs, die gerade einen Sturmangriff ausführen von den Tastendrücken des Spielers kontrolliert werden (Haken Schlagen auf der Flucht kontrolliert die Laufrichtung der Gegner; drehen während dem Sturmangriff eines Gegners lässt den Gegner umdrehen).

    Der Code dazu (für Gothic 2) ist dieser:
    Code:
    func void FixPlayerControllsTurnOnNpcAttackMoveBug () {
        const int jmp1adr = 7673973; //0x751875
        const int jmp2adr = 7673984; //0x751880
        
        const int newJumpTarget = 7674204; //0x75195C
        
        //sind wahrscheinlich auf der selben Seite, aber egal.
        //ein zusätzlicher Aufruf tut nicht weh
        MemoryProtectionOverride (jmp1adr, 4);
        MemoryProtectionOverride (jmp2adr, 4);
        
        MEM_WriteInt (jmp1adr, newJumpTarget - jmp1adr - 4);
        MEM_WriteInt (jmp2adr, newJumpTarget - jmp2adr - 4);
    };
    Letztendlich wird in der Funktion EV_AttackMove ein Aufruf von PC_Turnings übersprungen, der meines erachtens da nicht hingehört.
    Hatte auch genau den Effekt, den ich wollte.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts
    Geändert von Sektenspinner (03.01.2011 um 01:01 Uhr)

Seite 13 von 21 « Erste ... 269101112131415161720 ... Letzte »

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide