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 7 von 7
  1. Beiträge anzeigen #1 Zitieren
    Held Avatar von Teron Gorefiend
    Registriert seit
    Nov 2006
    Ort
    im Alchemielabor
    Beiträge
    5.121
     
    Teron Gorefiend ist offline

    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.

  2. Beiträge anzeigen #2 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    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)

  3. #3 Zitieren
    Falugify
    Gast
     
    Du lässt immer einen neuen Wolf spawnen. Die Instanz sollte einzigartig sein, wenn Gothic den Wolf korrekt erkennen soll.

  4. Beiträge anzeigen #4 Zitieren
    Held Avatar von Teron Gorefiend
    Registriert seit
    Nov 2006
    Ort
    im Alchemielabor
    Beiträge
    5.121
     
    Teron Gorefiend ist offline
    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.

  5. Beiträge anzeigen #5 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.781
     
    Kirides ist offline
    Zitat Zitat von Teron Gorefiend Beitrag anzeigen
    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);

  6. Beiträge anzeigen #6 Zitieren
    Provinzheld
    Registriert seit
    May 2014
    Ort
    Malchow
    Beiträge
    235
     
    dragonkiller1995 ist offline
    Hallo vor kurzem versuchte ich das gleiche mit einem schattenläufer jedoch griff er mich an als ich ihn per cheat einfügte

  7. Beiträge anzeigen #7 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.781
     
    Kirides ist offline
    Zitat Zitat von dragonkiller1995 Beitrag anzeigen
    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
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