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

 

Ergebnis 1 bis 13 von 13
  1. Beiträge anzeigen #1 Zitieren
    Waldläufer
    Registriert seit
    Nov 2017
    Ort
    Düsseldorf, NRW, Deutschland
    Beiträge
    123
     
    Vikiller94 ist offline

    [Gothic 2] NPC Magierkreis im Script zuweisen

    Hallo euch allen,

    Ich habe jetzt inzwischen fehlerfrei eine Rune mit der Magie erstellt und will einem NPC zuweisen. Das Problem ist jedoch das im NPC Script dies nicht angegeben ist.

    Kann mir jemand dabei helfen?

    Das Problem ist halt, dass andere Magier keinen Kreis in ihrem Script angegeben haben (Xardas oder Milten).

    Und wenn ich einem NPC meine Kreis 5 Magie gebe, kann er die nicht verwenden. (Ich habe dem NPC diese Rune per B_Select_Spell zugewiesen.


    Danke im Voraus,
    Viktor

  2. Beiträge anzeigen #2 Zitieren
    Knight Avatar von Draxes
    Registriert seit
    Aug 2007
    Ort
    Mainz
    Beiträge
    1.920
     
    Draxes ist offline
    Soweit ich weiß interessieren sich andere Npcs nicht für Magiekreise, die Zaubern einfach, wenn sie das über die B_SelectSpell() sollen.

    Hast du mal prints an den entsprechenden Stellen eingefügt um zu schauen, ob die Funktion bei deinem Npc überhaupt zu der Stelle kommt? Die B_SelectSpell() ist vom Programmierstil her eine ziemliche Diva, weil für alles mögliche irgendetwas abgeprüft wird. Seien es jetzt Gilden, Aivars, Ids...

  3. Beiträge anzeigen #3 Zitieren
    Waldläufer
    Registriert seit
    Nov 2017
    Ort
    Düsseldorf, NRW, Deutschland
    Beiträge
    123
     
    Vikiller94 ist offline
    Hallo Draxes,


    Ich schicke dir meinen B_Select_Spell.d. Also es funktioniert alles, nun möchte ich gerne, dass der Geralt (Mein NPC) Kreisstufe 5 ist und nicht 6. Kann man das irgendwie ändern?

    PS: Der ist KDF und dieser Zauber hat funktioniert!


    Kannst du mir auch sagen, wie man es schafft, dass der Geralt keine Vollheilung macht sondern sofort mit Magie attackiert? Und wie schafft man dass er aus der Distanz ein Schwert zieht und nicht die Magie?


    Wenn du mir das zeigst, dann bist du mein HELD!
    Angehängte Dateien

  4. Beiträge anzeigen #4 Zitieren
    Knight Avatar von Draxes
    Registriert seit
    Aug 2007
    Ort
    Mainz
    Beiträge
    1.920
     
    Draxes ist offline
    Wie gesagt, hast du mal prints an der Stelle eingebaut? Du hast deinen Code am Ende der B_SelectSpell() stehen, da kann es gut sein, dass dein Npc schon vorher aus der Funktion rausgeht. Weil er zum Beispiel der Gilde GIL_KDF angehört und dann beim nächstbesten return schon aus der Funktion herausfliegt. Wäre also eine Überlegung wert, dass du deinen Code an den Anfang der Funktion ziehst. Umso spezieller dein Fall, desto weiter oben sollte er auch stehen. Sowas wie Gildenprüfungen dann besser weiter unten, damit die Spezialfälle vorher schon greifen.

    Dass dein Npc die Nahkampfwaffe nutzt hast du in deinem Code schon stehen. Dort prüfst du, ob der Gegner eine gewisse Distanz weit entfernt ist. Falls ja: Benutze Zauber (Gehe also mit dem Wert TRUE aus der Funktion heraus), andernfalls benutze die Nahkampffwaffe (Gehe also mit dem Wert FALSE aus der Funktion heraus).

    Dein Anliegen mit dem Magiekreis verstehe ich noch nicht so ganz. Wieso ist es notwendig, dass ein Npc, den du nicht selber spielst, einen bestimmten Magiekreis hat? Davon kriegt der Spieler doch ohnehin nichts mit.

  5. Beiträge anzeigen #5 Zitieren
    Waldläufer
    Registriert seit
    Nov 2017
    Ort
    Düsseldorf, NRW, Deutschland
    Beiträge
    123
     
    Vikiller94 ist offline
    Zitat Zitat von Draxes Beitrag anzeigen
    Wie gesagt, hast du mal prints an der Stelle eingebaut? Du hast deinen Code am Ende der B_SelectSpell() stehen, da kann es gut sein, dass dein Npc schon vorher aus der Funktion rausgeht. Weil er zum Beispiel der Gilde GIL_KDF angehört und dann beim nächstbesten return schon aus der Funktion herausfliegt. Wäre also eine Überlegung wert, dass du deinen Code an den Anfang der Funktion ziehst. Umso spezieller dein Fall, desto weiter oben sollte er auch stehen. Sowas wie Gildenprüfungen dann besser weiter unten, damit die Spezialfälle vorher schon greifen.

    Dass dein Npc die Nahkampfwaffe nutzt hast du in deinem Code schon stehen. Dort prüfst du, ob der Gegner eine gewisse Distanz weit entfernt ist. Falls ja: Benutze Zauber (Gehe also mit dem Wert TRUE aus der Funktion heraus), andernfalls benutze die Nahkampffwaffe (Gehe also mit dem Wert FALSE aus der Funktion heraus).

    Dein Anliegen mit dem Magiekreis verstehe ich noch nicht so ganz. Wieso ist es notwendig, dass ein Npc, den du nicht selber spielst, einen bestimmten Magiekreis hat? Davon kriegt der Spieler doch ohnehin nichts mit.
    Was heisst prints?

  6. Beiträge anzeigen #6 Zitieren
    Knight Avatar von Draxes
    Registriert seit
    Aug 2007
    Ort
    Mainz
    Beiträge
    1.920
     
    Draxes ist offline
    Dass du vor/in deinem Code soetwas stehen hast wie

    Code:
    print("Bis hierhin bin ich schon mal gekommen");
    Das zeigt dir dann Ingame diese Meldung an. Dann wüsstest du schon Mal, ob dein Code überhaupt aufgerufen wird.

  7. Beiträge anzeigen #7 Zitieren
    Waldläufer
    Registriert seit
    Nov 2017
    Ort
    Düsseldorf, NRW, Deutschland
    Beiträge
    123
     
    Vikiller94 ist offline
    Zitat Zitat von Draxes Beitrag anzeigen
    Dass du vor/in deinem Code soetwas stehen hast wie

    Code:
    print("Bis hierhin bin ich schon mal gekommen");
    Das zeigt dir dann Ingame diese Meldung an. Dann wüsstest du schon Mal, ob dein Code überhaupt aufgerufen wird.


    Achso. Aber wie würde ich dies Ingame sehen? Und wo genau platziert man das im Script?


    Draxes kannst du mir hier kurz helfen bei diesem Script?




    if (Hlp_GetInstanceID(slf) == NONE_90000_Geralt)


    {
    if (Npc_HasItems (slf, ItRu_FullHeal) == 0)
    {
    CreateInvItems (slf, ItRu_FullHeal, 1);
    };

    if (Npc_HasItems (slf, Frost_Rune) == 0)
    {
    CreateInvItems (slf, Frost_Rune, 1);
    };




    if (self.attribute[ATR_HITPOINTS] < 400)
    {

    B_ReadySpell (slf, SPL_FullHeal, SPL_Cost_FullHeal);
    return TRUE;

    };

    if (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE) && (C_NpcIsEvil (oth))

    {
    B_ReadySpell (slf, Frost_Rune, SPL_Cost_Frost);
    return TRUE;
    }

    else
    {
    return FALSE; //Angriff mit Waffen
    };

    };






    Diesen Script habe ich ganz nach oben platziert. Nun ist es mein Ziel, dass der NPC bei einem gewissen Wert sich auftankt mit der Rune "Schwere Heilung". Dann wenn es dies getan hat, soll er automatisch erkennen ob ich weit von ihm bin oder nicht. Wenn ja schießt er mit Magie, wenn nein, zuckt er sein Schwert raus.


    Das Problem: Wenn ich ihn mit Bogen beschieße, heilt er sich nur und zuckt sein Schwert raus.

    Wenn ich aber diesen ersten Eintrag lösche "if (self.attribute[ATR_HITPOINTS] < 400)" und dann ihn wieder mit dem Bogen beschieße, zuckt er sein Schwert raus.


    Ich habe irgendwie das Gefühl dieser Eintrag funkt nicht ganz richtig "if (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE) && (C_NpcIsEvil (oth))"



    PS: Ich habe ihm die KDF Gilde weggenommen.


    Woran kann das liegen?

    Tut mir Leid wenn ich dumme Fragen stelle oder dumme Aktionen mache. Ich habe nicht viel Erfahrung darin

  8. Beiträge anzeigen #8 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Zusätzlich zur Distanz fragst du zurzeit ab ob C_NpcIsEvil (oth) und Geralt wechselt nur auf den Zauber wenn dies der Fall ist.
    C_NpcIsEvil (oth) gibt wahrscheinlich für den hero immer FALSE zurück. Du kannst dir diese Funktion ja mal anschauen. Als "böse" definiert sind NPCs bei denen in Gothic2 Paladin Schadenszauber wirken sollen.
    Was anderes: Du verwendest manchmal "slf" und manchmal "self". Das funktioniert war auf den ersten Blick so, du solltest es dir aber angewöhnen in dieser Funktion nur "slf" zu verwenden. "slf" ist eine Referenz auf einen NPC der als Parameter an die Funktion übergeben wird. "self" ist eine globale Variable in welcher nicht zwingend auf den gleichen NPC verweist. Wenn du das durcheinander mischt kannst du Fehler produzieren welche später sehr schwer zu finden und zu beheben sind.
    Geändert von Cryp18Struct (06.09.2018 um 07:57 Uhr)

  9. Beiträge anzeigen #9 Zitieren
    Waldläufer
    Registriert seit
    Nov 2017
    Ort
    Düsseldorf, NRW, Deutschland
    Beiträge
    123
     
    Vikiller94 ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Zusätzlich zur Distanz fragst du zurzeit ab ob C_NpcIsEvil (oth) und Geralt wechselt nur auf den Zauber wenn dies der Fall ist.
    C_NpcIsEvil (oth) gibt wahrscheinlich für den hero immer FALSE zurück. Du kannst dir diese Funktion ja mal anschauen. Als "böse" definiert sind NPCs bei denen in Gothic2 Paladin Schadenszauber wirken sollen.
    Also heisst das im Endeffekt, dass C_NpcIsEvil FALSE returnt. Also sollte ich diesen Eintrag löschen?

    Gruss Viktor

  10. Beiträge anzeigen #10 Zitieren
    Waldläufer
    Registriert seit
    Nov 2017
    Ort
    Düsseldorf, NRW, Deutschland
    Beiträge
    123
     
    Vikiller94 ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Zusätzlich zur Distanz fragst du zurzeit ab ob C_NpcIsEvil (oth) und Geralt wechselt nur auf den Zauber wenn dies der Fall ist.
    C_NpcIsEvil (oth) gibt wahrscheinlich für den hero immer FALSE zurück. Du kannst dir diese Funktion ja mal anschauen. Als "böse" definiert sind NPCs bei denen in Gothic2 Paladin Schadenszauber wirken sollen.
    Was anderes: Du verwendest manchmal "slf" und manchmal "self". Das funktioniert war auf den ersten Blick so, du solltest es dir aber angewöhnen in dieser Funktion nur "slf" zu verwenden. "slf" ist eine Referenz auf einen NPC der als Parameter an die Funktion übergeben wird. "self" ist eine globale Variable in welcher nicht zwingend auf den gleichen NPC verweist. Wenn du das durcheinander mischt kannst du Fehler produzieren welche später sehr schwer zu finden und zu beheben sind.

    Ok, ich werde ab jetzt slf verwenden.

  11. Beiträge anzeigen #11 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Probier mal folgenden code. Da sind jetzt wie von Draxes vorgeschlagen prints eingebaut:
    Code:
    if (Hlp_GetInstanceID(slf)     == NONE_90000_Geralt)
    
    
    {
        if (Npc_HasItems (slf, ItRu_FullHeal) == 0)
            {
                CreateInvItems (slf, ItRu_FullHeal, 1);
            };
            
        if (Npc_HasItems (slf, Frost_Rune) == 0)
            {
                CreateInvItems (slf, Frost_Rune, 1);
            };
            
            
    
    
        if (slf.attribute[ATR_HITPOINTS] < 400) 
            {
                print("Ich heile mich, weil wenig HP");
                B_ReadySpell (slf, SPL_FullHeal, SPL_Cost_FullHeal); 
                return TRUE;
            
            };
            
        if     (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE) && (C_NpcIsEvil (oth))
            
            {
                print("Ich zaubere weil weit genug weg und Ziel ist Böse.");
                B_ReadySpell (slf, Frost_Rune, SPL_Cost_Frost);
                return TRUE;
            }                
            
            else
            {
                if(! C_NpcIsEvil (oth)){
                            print("Ich zaubere nicht weil das Ziel nicht Böse ist.");
                };
                return FALSE; //Angriff mit Waffen
            };
        
    };
    Wenn der NPC gegen den hero Kämpft solltest du in regelmäßigen Abständen den Satzt "Ich zaubere nicht weil das Ziel nicht Böse ist." auf dem Bildschirm sehen. Lösen kannst du das Problem dann indem du die Abfrage C_NpcIsEvil (oth) weglässt.

  12. Beiträge anzeigen #12 Zitieren
    Waldläufer
    Registriert seit
    Nov 2017
    Ort
    Düsseldorf, NRW, Deutschland
    Beiträge
    123
     
    Vikiller94 ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Probier mal folgenden code. Da sind jetzt wie von Draxes vorgeschlagen prints eingebaut:
    Code:
    if (Hlp_GetInstanceID(slf)     == NONE_90000_Geralt)
    
    
    {
        if (Npc_HasItems (slf, ItRu_FullHeal) == 0)
            {
                CreateInvItems (slf, ItRu_FullHeal, 1);
            };
            
        if (Npc_HasItems (slf, Frost_Rune) == 0)
            {
                CreateInvItems (slf, Frost_Rune, 1);
            };
            
            
    
    
        if (slf.attribute[ATR_HITPOINTS] < 400) 
            {
                print("Ich heile mich, weil wenig HP");
                B_ReadySpell (slf, SPL_FullHeal, SPL_Cost_FullHeal); 
                return TRUE;
            
            };
            
        if     (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE) && (C_NpcIsEvil (oth))
            
            {
                print("Ich zaubere weil weit genug weg und Ziel ist Böse.");
                B_ReadySpell (slf, Frost_Rune, SPL_Cost_Frost);
                return TRUE;
            }                
            
            else
            {
                if(! C_NpcIsEvil (oth)){
                            print("Ich zaubere nicht weil das Ziel nicht Böse ist.");
                };
                return FALSE; //Angriff mit Waffen
            };
        
    };
    Wenn der NPC gegen den hero Kämpft solltest du in regelmäßigen Abständen den Satzt "Ich zaubere nicht weil das Ziel nicht Böse ist." auf dem Bildschirm sehen. Lösen kannst du das Problem dann indem du die Abfrage C_NpcIsEvil (oth) weglässt.


    Vielen, vielen Dank. Ich werde das heute Nachmittag ausprobieren! Danke nochmal😉😊😊😊

  13. Beiträge anzeigen #13 Zitieren
    Waldläufer
    Registriert seit
    Nov 2017
    Ort
    Düsseldorf, NRW, Deutschland
    Beiträge
    123
     
    Vikiller94 ist offline
    Hallo an jeden,


    es hat funktioniert! Ich habe ihn so programmiert, sodass er in der Nähe sein Schwert zieht und in der Ferne seine Magie. Es lag DOCH WOHL AN C_NPCISEVIL!

    Wie es auch sei vielen, vielen Dank euch beiden! Prints sind sehr hilfreich um zu sehen, an welcher Stelle der Compiler angekommen ist.


    Mein endgültiger Script ist:

    if (Hlp_GetInstanceID(slf) == NONE_90000_Geralt)


    {
    if (Npc_HasItems (slf, ItRu_FullHeal) == 0)
    {
    CreateInvItems (slf, ItRu_FullHeal, 1);
    };

    if (Npc_HasItems (slf, Frost_Rune) == 0)
    {
    CreateInvItems (slf, Frost_Rune, 1);
    };





    if (Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE)

    {

    if (self.attribute[ATR_HITPOINTS] < 200)
    {

    print ("Ich heile mich, weil wenig HP");
    B_ReadySpell (slf, SPL_FullHeal, SPL_Cost_FullHeal);
    return TRUE;

    };

    print ("Ich zaubere, weil der Gegner weit weg ist");
    B_ReadySpell (slf, SPL_Frost, SPL_Cost_Frost);
    return TRUE;
    }



    else

    {


    };



    return FALSE;

    };






    [THREAD CLOSED]

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