|
-
Probleme mit meinem zahmen Tier
In Zeiten von Corona kann man auch mal wieder an längst pausierte Projekte arbeiten.
Womit ich vor einiger Zeit angefangen habe war ein Pet Mod, wo man mit einem zahmen Tier rumläuft. Was die Gegner angreift. Tolles Prinzip macht Spaß. Wolf lebt ewig und greift weder Menschen an noch wird es von diesen angegriffen. Werte des Pets sind abhängig von den Werten des Helden. Dies erlaubt ein komplett neues Gameplay vorallem als Jäger. So kann man mehrmals mit dem Bogen auf die Gegner schießen während das Pet zuzusagen tankt und Schaden einsteckt.
Gleichzeitig kann man mit dem Tier reden und das Verhalten ändern (so wie mit Liesel). Hier sind meine scripte. Was Schadensberechnung, Berechnung von Werten etc. anbelangt klappt soweit alles. Nur mit der AI habe ich so meine Probleme.
Code:
Wolf-script. MST_Wolf
INSTANCE Wolf_pet (Mst_Default_Wolf)
{
name = "zahmer Wolf";
guild = GIL_SUMMONED_WOLF;
aivar[AIV_MM_REAL_ID] = ID_SUMMONED_WOLF;
///Werte werden woanders berechnet, das klappt)
aivar[AIV_PARTYMEMBER] = TRUE;
B_SetAttitude (self, ATT_FRIENDLY);
if (pet_follow == 1)
{
start_aistate = ZS_MM_Rtn_Summoned;
};
aivar[AIV_ToughGuy] = TRUE;
aivar[AIV_ToughGuyNewsOverride] = TRUE;
B_SetVisuals_Wolf();
Npc_SetToFistMode(self);
};
////Spell summon wolf
func void Spell_Cast_SummonWolf()
{
if (Npc_GetActiveSpellIsScroll(self))
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
}
else
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonWolf;
};
if (Npc_IsPlayer(self))
{
pet_follow =0;
if (Npc_IsDead(Wolf_pet))
{
pet_follow =1;
Wld_SpawnNpcRange (self, Wolf_pet, 1, 500); B_calcpetvalues(Wolf_pet);
pet_follow =0;
};
}
else
{
Wld_SpawnNpcRange (self, Wolf, 1, 500);
};
self.aivar[AIV_SelectSpell] += 1;
};
///Der Zauberspruch summon goblin skelton wird verwendet, um das Tier verschwinden zu lassen
if (Npc_IsPlayer(self))
{
///Wld_SpawnNpcRange (self, SUMMONED_GOBBO_SKELETON, 1, 500);
B_RemoveNpc (Wolf_pet);
};
und zu guter letzt kann man über Lego Bars mit der Taste R den Wolf nahe des anvisierten Gegners spawnen
if (MEM_KeyPressed(KEY_R))
{
if(Npc_GetTarget(hero)) //Hero has target (victim in focus)
&& (Npc_IsDead(Wolf_pet))
&& (hero.attribute[ATR_MANA] >= 10)
{
Npc_ChangeAttribute (hero, ATR_MANA, -10);
Wld_SpawnNpcRange (other, Wolf_pet, 1, 400);
};
mein Code ist wahrscheinlich totaler Müll und deswegen habe ich folgende Probleme.
1: Das Wegschicken des Tieres (mit Zauberspruch summon goblin) tötet das Tier entfernt es aber nicht.
2: Mein Hauptproblem ist: Ich kann das Tier nicht aktiv auf Gegner schicken. Das Pet ist nicht aggressiv genug. Erst wenn mich ein Gegner trifft (nicht angreift sondern trifft) greift mein Tier an. Und wenn es nicht gleich sofort trifft lande ich mehrere Treffer was nicht toll ist.
3: Ohne die Variabel pet_follow würde ich das Tier mit der Taste R zwar neben meinem Gegner spawnen, aber es würde sofort zu mir zurücklaufen ohne den Gegner anzugreifen. Mit dieser Variabel folgt es mir nur wenn es entweder mit dem Zauber summon_wolf beschworen wurde oder im Kampf getroffen wird (kämpft dann erst gegen den Gegner und folgt mir danach).
4: Nach jedem Kampf muss ich meinen Begleiter erst wegschicken und dann neu beschwören was ziemlich umständig ist. Außerdem buggt es manchmal und ich habe dann zwei Tierbegleiter was nicht sein sollte. Sollte was einfacheres geben wie B_Attack (pet_wolf, other, AR_SuddenEnemyInferno,0); was aber anscheinend nur für NPC wirkt.
Also jemand ne Idee was ich machen könnte.
-
Mal ne Frage: Nutzt dein Tier menschliche Wahrnehmungen?
Ich hab einen Begleiter in G2 dem ich befehlen kann, mich zu beschützen und sofort mein Ziel anzugreifen, völlig Wurscht wer es ist.
Dazu greife ich in die ZS_Watchfight ein.
Code:
if (Hlp_GetInstanceID (self)==Hlp_GetInstanceID (AMZ_4439_Ragnar)) && beschuetzmich==1
{
AI_StandUpQuick (self);
if Hlp_GetInstanceID (other)==Hlp_GetInstanceID (hero)
{
B_Attack (self,victim,AR_Beschuetzen,0);
};
if Hlp_GetInstanceID (victim)==Hlp_GetInstanceID (hero)
{
B_Attack (self,other,AR_Beschuetzen,0);
};
};
Der AR_Beschuetzen ist dazu da, dass der bestimmte Outputs raushaut. Kannste bei nem Tier natürlich weglassen.
Das hier in der ZS_Attack sollte aber auch helfen:
Code:
if (Npc_GetTarget (self) ==Hlp_GetInstanceID (hero))
&& (Npc_GetTarget (self)!=Hlp_GetInstanceID (AMZ_4439_Ragnar))
&& AMZ_4439_Ragnar.aivar[AIV_PARTYMEMBER]==TRUE
&& Npc_GetDistToNpc (AMZ_4439_Ragnar,hero)<=2000
&&beschuetzmich==1
{
AI_StandUpQuick (AMZ_4439_Ragnar);
B_Attack (AMZ_4439_Ragnar,self,AR_Beschuetzen,1);
};
Direkt unter
Code:
self.aivar[AIV_LASTTARGET] = Hlp_GetInstanceID (other);
Wenn irgendwer den Helden als Angriffsziel hat, schmeißt mein Begleiter sich auf der Stelle dazwischen.
Das wäre jetzt die einfache Version. Funktioniert bei mir sehr gut.
Du musst natürlich die Instanzabfragen an deinen Begleiter anpassen.
Edit: zum thema tot aber nicht despawnt: hast du einen wp tot in deiner map?
Geändert von Bisasam (20.01.2021 um 12:06 Uhr)
-
20.01.2021 14:24
#3
Du lässt immer einen neuen Wolf spawnen. Die Instanz sollte einzigartig sein, wenn Gothic den Wolf korrekt erkennen soll.
-
klappt einigermaßen, wenn mich ein tier angreift greift mein Tier zurück. Wenn es nur droht bleibt es nur stehen und tut nichts. Aber vielleicht gefällt mir das auch so ganz gut. Trotzdem wäre es super mein Tier irgendwie per Tastendruck oder so auf Gegner zu schicken.
@Falugify ja meinem Tier eine einzigartige Instanz geben wäre ne gute Idee. Aber wie macht man das mit Tieren?
Ich habe nämlich noch ein anderes Problem. Ich benutze den Zauber summon wolf. Bei func int ZS_MM_Rtn_Summoned_Loop() habe ich einfach das Npc_ChangeAttribute (self, ATR_HITPOINTS, -self.attribute[ATR_HITPOINTS_MAX]); rausgelassen. Eigendlich müsste mein Tier somit ewig leben sofern es keinen Schaden nimmt. Trotzdem stirbt mein Tier einfach so ab und zu ohne Grund.
-
Zitat von Teron Gorefiend
klappt einigermaßen, wenn mich ein tier angreift greift mein Tier zurück. Wenn es nur droht bleibt es nur stehen und tut nichts. Aber vielleicht gefällt mir das auch so ganz gut. Trotzdem wäre es super mein Tier irgendwie per Tastendruck oder so auf Gegner zu schicken.
@Falugify ja meinem Tier eine einzigartige Instanz geben wäre ne gute Idee. Aber wie macht man das mit Tieren?
Ich habe nämlich noch ein anderes Problem. Ich benutze den Zauber summon wolf. Bei func int ZS_MM_Rtn_Summoned_Loop() habe ich einfach das Npc_ChangeAttribute (self, ATR_HITPOINTS, -self.attribute[ATR_HITPOINTS_MAX]); rausgelassen. Eigendlich müsste mein Tier somit ewig leben sofern es keinen Schaden nimmt. Trotzdem stirbt mein Tier einfach so ab und zu ohne Grund.
Also das Spiel regelt "einzigartige instanzen" mehr oder weniger danach, das es die Monster einfach woander hin verfrachtet (z.B. bei TOT zwischenlagern und Routine ändern) oder vorherige instanzen entfernt bevor eine neue eingefügt wird.
Hier am Beispiel des Irrlichts:
Code:
// Irrlicht entfernen
var C_NPC DetWsp; DetWsp = Hlp_GetNpc (Wisp_Detector);
AI_Teleport (DetWsp, "TOT");
B_RemoveNpc (DetWsp);
AI_Teleport (DetWsp, "TOT");
Wld_SpawnNpcRange (self, Wisp_Detector, 1, 500);
DetWsp = Hlp_GetNpc (Wisp_Detector);
-
Hallo vor kurzem versuchte ich das gleiche mit einem schattenläufer jedoch griff er mich an als ich ihn per cheat einfügte
-
Zitat von dragonkiller1995
Hallo vor kurzem versuchte ich das gleiche mit einem schattenläufer jedoch griff er mich an als ich ihn per cheat einfügte
Ist die Attitude denn richtig gesetzt?
Schau mal bei den Beschworenen Kreaturen vorbei, da sieht man das gut.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|