World of Gothic Archiv > Editing
Todes-Dialog
Seite 1 von 1  1 
21.08.2003, 17:48 #1
dark-base
Beiträge: 26
Todes-Dialog
Ich habe da ein kleines Problem. Ich hatte die Datei ZS_Dead.d im Ordner [GDATA]/scripts/content/AI/ZS_Human so verändert, dass nach dem Tod des Heldens ein Dialog aufgerufen werden sollte. Damit aber dieser Dialog funktionierte, musste mann dem Held 1 HP Punkt geben. Damit aber einem dann nicht die Gegner sofort wieder totschlagen hatte ich eine Funktion aufgerufen die den Befehl AI_Wait am Gegner durchführte. Durch den Funktionsaufruf wurde nämlich gleichzeitig der Code weiterverarbeitet wie in so vielen Skriptsprachen. Bis auf das manchmal der Held nicht seine Fallanimation abspielt weil der Dialog zu schnell kam klappte ja alles, bis ich diese Skript bei Orks testete. Da Orks mehrmals zuschlagen und nicht durch AI_Wait dabei gebremst werden war der Held sofort wieder tot und es funktionierte gar nichts mehr.Das einzige was mann noch wissen muss ist dass ich die globale Integer Variable "Tod" in der datei [GDATA]/scripts/content/_Intern/constants.d erstellt hab da mein Dialog dieses als condition hatte:
code\:

if (Tod == 1)
{
return 1;
};


wogegen der Sleepabit Dialog so modifieziert wurde dass er nur startete wenn Tod == 0 ist.
So hier ist nur der Code aus der ZS_Dead.d Datei:
code\:


func void GWait () //Gegener warten lassen
{
AI_Wait (other,12.0);//müsste reichen
};



func void Todesmenu ()
{

var C_NPC her;
her = Hlp_GetNpc(PC_Hero);
var C_NPC rock;
rock = Hlp_GetNpc(PC_Rockefeller);



if ( (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))
|| (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(rock)) )
{


GWait();
PrintScreen ("Du bist der Held", -1,-1,"font_old_10_white_HI.tga",9);


Tod = 1; //Ist für später für den Dialog wichtig

self.aivar[AIV_INVINCIBLE]=TRUE;
Ai_ProcessInfos (her);
Npc_ChangeAttribute (self, ATR_HITPOINTS, self.attribute[1]); //Muss seien sonst funzt Dialog nicht

};

};



func void ZS_Dead ()
{
PrintDebugNpc (PD_ZS_FRAME, "ZS_Dead" );
PrintGlobals (PD_ZS_CHECK);

C_ZSInit();

self.aivar[AIV_PLUNDERED] = FALSE;

//-------- Erfahrungspunkte für den Spieler ? --------
//SN: VORSICHT, auch in B_MagicHurtNpc() vorhanden!
if Npc_IsPlayer (other)
|| (C_NpcIsHuman (other) && other.aivar[AIV_PARTYMEMBER])
|| (C_NpcIsMonster(other) && other.aivar[AIV_MM_PARTYMEMBER])
{
B_DeathXP(); // vergibt XP an SC
};

//-----------eigene Abfrage um die Mordbilianz festzustellen *g-----------------------------

//----Wenn ein Mensch einen Menschen getötet hat-------
if (C_NpcIsHuman (self)
&& C_NpcIsHuman (other))

{
PrintScreen ("Ein Npc hat einen Kameraden auf dem Gewissen", -1,-1,"font_old_10_white_HI.tga",3);
Todesmenu();
}



//----Wenn ein Mensch von einem Monster getötet wurde-------
else if (C_NpcIsHuman (self)
&& (C_NpcIsMonster (other) || C_NpcIsOrc (other)))
{

PrintScreen ("Ein Npc wurde von einem Monster getötet", -1,-1,"font_old_10_white_HI.tga",3);
Todesmenu();
};

//-----------------------------------------------------------------------------------------



if C_NpcIsMonster(self)
{
B_GiveDeathInv (); // für Monster
PrintScreen ("Ein Monster wurde emordet", -1,-1,"font_old_10_white_HI.tga",3);
};
B_CheckDeadMissionNPCs ();
B_Respawn (self);
};

21.08.2003, 19:12 #2
HomerDOHSimpson
Beiträge: 14

Iiiiikkk. Ich kann dir zwar keine direkte Lösung geben aber vielleicht hilft ja n kleiner Denkanstoss.
Könnte man nicht ne Art von "Zeitfenster" einbauen BEVOR du dem Helden 1 HP gibst. Also du stirbst (die Orks haun noch mal kräftig zu) und nach 2 sek gibste ihm nen HP.
Oder vielleicht gibts nen Befehl der die Animation der Orks stoppt.
21.08.2003, 21:52 #3
HornOx
Beiträge: 1.458

quote:
Wer hiereinpostet sollte bitte allerdings seinen Code erst selbst getestet haben, erspart mir viel Arbeit.
Toll, weil du weniger Arbeit haben willst schiebst du Arbeit auf andere(die dir nur ratschläge/Tipps geben wollen) ab :( Der folgende Code ist ungetestet, also ignorier ihn bitte oder verzichte in Zukunft auf solche AGBs ;)

Npc_ChangeAttribute (self, ATR_HITPOINTS, self.attribute[1]);// gibt dem helden die maximalen trefferpunkte, nicht nur einen

Warum machst du den helden nicht kurze Zeit unsterblich?
code\:
func int not (var int zahl)
//sollte ein bittweises not der Zahl zurückgeben//hab keine ahnung ob es auch beim vorzeichenbit funktioniert...
//gibts echt kein bitweises not?
{
return (32767-zahl);
};
[...]
hero.flags = hero.flags | NPC_FLAG_IMMORTAL; // kommt an die Stelle wo der held unsichtbar wird
[...]
hero.flags = hero.flags & not(NPC_FLAG_IMMORTAL); // kommt an die Stelle wo der held wieder sichtbar wird
22.08.2003, 00:28 #4
dark-base
Beiträge: 26

quote:
Zitat von HornOx
Toll, weil du weniger Arbeit haben willst schiebst du Arbeit auf andere(die dir nur ratschläge/Tipps geben wollen) ab :( Der folgende Code ist ungetestet, also ignorier ihn bitte oder verzichte in Zukunft auf solche AGBs ;)


War wirklich keine so gute Idee, habs auch schon weg editiert:)

dein Vorschlag war super nur leider klappt er nicht. Sobald man dem hero den flag gibt springt der dialog an ,hängt sich aber dann auf und man kann sich nur mit dem marvin-mode und der F8 Taste retten.
Habs mit deiner und anderen Möglickeiten wie den hero einfach nur diesen flag zu geben probiert, kalppt aber alles net.:(
23.08.2003, 06:54 #5
HornOx
Beiträge: 1.458

Npc_ChangeAttribute muß vor self.flags=NPC_FLAG_IMMORTAL; stehn sonst bewirkt der Befehl nichts, mein Fehler :( Aber funkt trotzdem nicht ;)

Mal zur abwechslung keine Lösung sondern ein weiteres Problem: Man kann AFAIK den Bodystate des (toten) Helden nicht ändern(AI_PlayAniBS funktioniert bei hero nicht:(). Und mit BS_DEAD kann der Held zwar laufen aber z.b. keine Betten mehr benutzten usw...
_Vermutlich_ wird der Bodystate beim Weltenwechsel nicht mitgenommen. Die einzigste Möglichkeit mit Aussicht auf Erfolg die mir momentan einfällt ist deshalb das der Held nach seinem Tod einen HP bekommt und dann in ein "Petrus-Level" gebeamt wird. Das gibt so halt lange Ladezeiten und der Held kann nicht an der Stelle seines Todes wiederbelebt werden :(
Seite 1 von 1  1