World of Gothic Archiv
> Editing NPCs sofort tot |
|
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: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\: .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\: 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: 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: 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: Ähm 0 HP ist doch tot, oder? AFAIK ist Ohnmacht immer 1 HP quote: Ist eigentlich klar: Du schreibst es erst an das Ende des Zustandes, also das self tot ist ;). quote: Das würde Nico's(<- sieht irgendwie falsch aus ) Version hinbekommen. quote: Warum einfach, wenn es auch umständlich geht ? :) :) naja, viel Spaß noch GüMü |
||
|