-
[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
-
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...
-
-
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.
-
Zitat von Draxes
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?
-
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.
-
Zitat von Draxes
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
-
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)
-
Zitat von Cryp18Struct
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
-
Zitat von Cryp18Struct
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.
-
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.
-
Zitat von Cryp18Struct
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😉😊😊😊
-
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
|