World of Gothic Archiv > Editing
NPCs sofort tot
Seite 1 von 1  1 
20.07.2003, 14:35 #1
Klemens
Beiträge: 150
NPCs sofort tot
Wie bekomm' ich es hin das NPCs nicht erst in Ohnmacht fallen sonder gleich tot sind ?
20.07.2003, 14:43 #2
NicoDE
Beiträge: 1.398

In welchem Zusammenhang?
(Fernwaffen und die meisten Magiesprüche töten sofort)

.nico
20.07.2003, 14:45 #3
Klemens
Beiträge: 150

Normale Schwerter
20.07.2003, 14:47 #4
dark-base
Beiträge: 26

Z.b. über diese funktion:

//////////////////////////////////////////////////////////////////////////
// B_KillNpc
// =========
// Setzt die Lebenspunkte des angegebenen NSCs auf 0.
//////////////////////////////////////////////////////////////////////////
func void B_KillNpc(var int npcInstance)
{
PrintDebugNpc (PD_ZS_DETAIL, "B_KillNpc");

var C_NPC npc; npc = Hlp_GetNpc(npcInstance);
var int itemInstance;

npc.flags = 0;

CreateInvItem (npc,ItMi_Stuff_OldCoin_02); // Mission-Item, das verhindert, daß die Toten entfernt werden

Npc_ChangeAttribute (npc, ATR_HITPOINTS, -npc.attribute[ATR_HITPOINTS_MAX]);

if (Npc_GetInvItemBySlot(npc,INV_WEAPON,1))
{
PrintDebugNpc (PD_ZS_DETAIL, "...Waffe in Slot 1 gefunden!");
itemInstance = Hlp_GetInstanceID(item);
Npc_RemoveInvItem (npc, itemInstance);
};

if (Npc_GetInvItemBySlot(npc,INV_WEAPON,2))
{
PrintDebugNpc (PD_ZS_DETAIL, "...Waffe in Slot 2 gefunden!");
itemInstance = Hlp_GetInstanceID(item);
Npc_RemoveInvItem (npc, itemInstance);
};
};

Bei dieser Funktion musst du einfach nur den instanznamen des npc übergeben und er wird sofort gekillt.
Du findest sie unter work/data/scripts/AI/AI_Intern und dort B_Functions.d . Geht aber nur bei Möglichkeiten wo man funktionen einsetzen kann, z.B. wenn du en Schwert machen willst ,was alle töte geht das hier nicht.
20.07.2003, 14:49 #5
dark-base
Beiträge: 26

sorry, habs geschrieben wärend dazu gepostet wurde.
20.07.2003, 14:58 #6
NicoDE
Beiträge: 1.398

quote:
Zitat von Klemens
Normale Schwerter
Wenn die Waffe magischen Schaden macht (siehe waffen besonderen schaden bei gegnern geben), tötet sie grundsätzlich sofort (mal abgesehen von anderen Skripten, die das auch beeinflussen).
Man sollte darauf achten, daß der Spieler es auch versteht - da er normalerweise davon ausgeht, daß Nahkampfwaffen nicht töten.

.nico
20.07.2003, 15:11 #7
Klemens
Beiträge: 150

Ich will das jede Waffe sofort tötet.
20.07.2003, 15:20 #8
dark-base
Beiträge: 26

Sehe ich das richtig ,dass du es so machen willst, dass bei jeder
Waffe ,sei es ein Hammer, ein Schwert, eine Lukerkralle... der Npc sofort tot ist?
20.07.2003, 15:23 #9
dark-base
Beiträge: 26

Genauer gesagt: bei jeder Waffe wo der Npc nnormalerweise bewußtlos ist?
20.07.2003, 15:58 #10
Klemens
Beiträge: 150

genau!
20.07.2003, 16:09 #11
dark-base
Beiträge: 26

Da gibt es zwei möglichkeiten: entweder du machst jeder waffe einen besonderen schadenstyp dazu, sodasss sie dann sofort tot sind oder du killst sie bei der ep verteilung. Dies ist in in der datei B_GiveXP.d
im Pfad scripts/content/stoy/b programmiert.
Du musst einfach den eintarg:

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

if C_NpcIsHuman(self)
&& Npc_WasInState(self, ZS_Unconscious)
{
PrintDebugNpc (PD_ZS_CHECK, "...Opfer ist bewußtloser Mensch!");
// SN: keine XP für Finishing-Move!!!
}
else
{
PrintDebugNpc (PD_ZS_CHECK, "...Opfer ist entweder nicht bewußtlos oder kein Mensch!");
B_GiveXP (self.level * XP_PER_LEVEL_DEAD);
};
};

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

//-------- Erfahrung nur beim ersten Sieg über Menschen --------
if !C_NpcIsHuman(self)
|| !self.aivar[AIV_WASDEFEATEDBYSC]
{
PrintDebugNpc (PD_ZS_CHECK, "...erster Sieg!");
B_GiveXP (self.level * XP_PER_LEVEL_DEAD); // die vollen XP beim Sieg vergeben, da finishing-Move keine XPs mehr ergibt!
};
};

ändern indem du unter die zwei B_GiveXP befehle den Kill befehl ausführst. Dass sieht dann so aus:

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

if C_NpcIsHuman(self)
&& Npc_WasInState(self, ZS_Unconscious)
{
PrintDebugNpc (PD_ZS_CHECK, "...Opfer ist bewußtloser Mensch!");
// SN: keine XP für Finishing-Move!!!
}
else
{
PrintDebugNpc (PD_ZS_CHECK, "...Opfer ist entweder nicht bewußtlos oder kein Mensch!");
B_GiveXP (self.level * XP_PER_LEVEL_DEAD);
B_KillNpc (self);
};
};

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

//-------- Erfahrung nur beim ersten Sieg über Menschen --------
if !C_NpcIsHuman(self)
|| !self.aivar[AIV_WASDEFEATEDBYSC]
{
PrintDebugNpc (PD_ZS_CHECK, "...erster Sieg!");
B_GiveXP (self.level * XP_PER_LEVEL_DEAD); // die vollen XP beim Sieg vergeben, da finishing-Move keine XPs mehr ergibt!
B_KillNpc (self);
};
};
20.07.2003, 16:26 #12
dark-base
Beiträge: 26

es kann aber seien dass die zweite methode probleme macht. Ich habs noch nie getestet ob dass klappt
20.07.2003, 17:32 #13
HornOx
Beiträge: 1.458

B_KillNpc hat ein paar nebenwirkungen (eine zusätliche Münze kommt dazu und die getragenen Waffen verschwinden), deswegen solltest du dir eine neue funktion schreiben.
Fairerweise solltest du den NPC in ZS_Unconscious töten, ansonsten sterben NPCs oder der PC die bzw der durch das Schwerter eines NPCs geschlagen wird nicht.
@dark-base: Probier mal den "editier"-Button aus ;) Und wenn du Veränderungen am Code farblich markierst findet man sie schneller.
20.07.2003, 19:45 #14
Klemens
Beiträge: 150

Ich hab's ausprobiert.
1. Die NPCs schlagen einen nachwievor KO.
2. Nur selten fallen die NPCs gleich tot um; meist fallen sie in Ohnmacht, stehen wieder auf, und fallen dann tot um.
20.07.2003, 20:27 #15
NicoDE
Beiträge: 1.398

Was hast Du ausprobiert?

code\:
func void ZS_Unconscious()
{
Npc_ChangeAttribute(self, ATR_HITPOINTS, -self.attribute[ATR_HITPOINTS]);
AI_StartState(self, ZS_Dead, 0, "");
return;

// ...


.nico
21.07.2003, 12:00 #16
Klemens
Beiträge: 150

funktioniert alles nicht:
1. Keine Exp
2. Charaktere liegen oft Ohnmächtig da (HP=0)
3. NPCs töten nicht
4. Andere sehen nicht das NPC tot
21.07.2003, 23:12 #17
Auron_X
Beiträge: 929

Bin mir jetzt net ganz sicher hab auch net viel überlegt, aber meine Idee:

ändere den END-Teil der ZS_unconscious in:

code\:
func void ZS_Unconscious_End ()
{
B_KillNpc (self);
};


CyA
22.07.2003, 02:01 #18
Malek
Beiträge: 6.225

Dann füg halt bei jeder Nahkampfwaffe zur Damagtype "DAM_MAGIC" als Zusatzattribut ein:
quote:

damagetype = DAM_EDGE|DAM_MAGIC;



Nur ein Beispiel. Aber damit änderst du nichts an der Waffe, ausser dass sie eben immer sofort tötet. Auch wenn Hero von einem NPC niedergeschlagen wird.
Damit die Waffe auch zusätzlichen Magieschaden verursacht, musst du schliesslich
quote:

damage[DAM_INDEX_MAGIC] = 10;



hinzufügen. Ich halte das für sicherer und stabiler als an den Zuständen der NPCs rumzudoktorn.
22.07.2003, 18:00 #19
Auron_X
Beiträge: 929

Jo, is natürlich sicherer... aber wenn meines funktionieren sollte... würde man weniger arbeit haben

cYa
22.07.2003, 23:59 #20
Malek
Beiträge: 6.225

Deine Version löst jedenfalls definitiv nicht das Problem mit den EXP.
23.07.2003, 06:24 #21
Klemens
Beiträge: 150

Irgendwie hab ich das bei mir auch schon mit den Exp hinbekommen, aber ich ahb immer das problem, dass die anderen nicht sehen dass der NPC tot ist und die NPCs meistens in Ohnmacht fallen, wieder aufstehen und dann tot umfallen. Nötig ist auch das der Faustkampf sofort tötet.
23.07.2003, 22:01 #22
GülleMüller
Beiträge: 472

High,
Ich würde es so machen, wie NicoDE es geschrieben hat.
Wenn man es so macht kann es Probs mit den XP geben, da in der Funktion B_DeathXP()(ist in B_GiveXP.d) der vorletzte Zustand auf ZS_Unconscious geprüft wird (was in diesem Fall natürlich TRUE[1] zurück gibt).
Der ScriptSchnipsel heißt:
[...]
if C_NpcIsHuman(self)
&& Npc_WasInState(self, ZS_Unconscious)

[...]

[EDIT]
Sry, falsche Info vorhin (hoffentlich hats keiner gesehen ;) ). Das hier sollte funzen:
[/EDIT]
Ich würde bei B_DeathXP (ist in B_GiveXP.d) die gesamte IF-Anweisung kicken und einfach B_GiveXP (self.level * XP_PER_LEVEL_DEAD); stehen lassen. Sollte keine weiteren Probs geben (außer z.B. der Arenakampf im Originalscript!)

Sonst ist mir beim Überfliegen der Scripts nichts aufgefallen, was potentiell Fehler hervorrufen könnte.

@Nico: Muß der ZS in diesem Fall trotzdem _Loop und _End haben?



quote:
2. Charaktere liegen oft Ohnmächtig da (HP=0)

Ähm 0 HP ist doch tot, oder? AFAIK ist Ohnmacht immer 1 HP

quote:
[...]die NPCs meistens in Ohnmacht fallen, wieder aufstehen und dann tot umfallen[...]

Ist eigentlich klar: Du schreibst es erst an das Ende des Zustandes, also das self tot ist ;).

quote:
Nötig ist auch das der Faustkampf sofort tötet.

Das würde Nico's(<- sieht irgendwie falsch aus ) Version hinbekommen.

quote:
Ich halte das für sicherer und stabiler als an den Zuständen der NPCs rumzudoktorn

Warum einfach, wenn es auch umständlich geht ? :) :)

naja, viel Spaß noch
GüMü
Seite 1 von 1  1