PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wer hat den NPC getötet?



Galerion
21.05.2012, 16:40
Hey Leute,

hab ein Problem bei einen Script, dieser funktioniert leider nur teilweise und wird nicht immer ausgeführt, es liegt definitiv an der "(NPC Reference.IsKiller Player == 1)" Abfrage, weiß jemand wie man dieses Problem umgehen kann oder ob es eine andere Abfrage gibt bzw. einen anderen Weg?

Wäre äußerst dankbar für Hilfe!

Freundliche Grüße

Galerion




SCN ZXAlphaRonHammerScript01

; --------------------------------------------------------------

Short Dead

; --------------------------------------------------------------

Float Timer

; --------------------------------------------------------------

Begin Gamemode
if (Dead == 0) && (ZZXMarkerAlphaisFrenzied01REF.GetDisabled == 0) && (ZZXAlphaRonHammerRef01.IsKiller Player == 1)
Set Timer to Timer + GetSecondsPassed
if (Timer >= 2.5)
SetObjectiveDisplayed XDialogAlpha 200 3
ShowMessage ZZXAlphaPeopleareMurdered
Set Timer to 0
Set Dead to 1
Endif
Endif
End

; --------------------------------------------------------------

Begin Gamemode
if (Dead == 1)
ZZXMarkerAlphaisFrenzied01REF.Disable
xAlphaDrGillesREF.RemoveFromFaction ZAAlpha
ZXAlphaDrWattsref.RemoveFromFaction ZAAlpha
xAlphaEdwardVandrossREF.RemoveFromFaction ZAAlpha
xAlphaMariaVandrossREF.RemoveFromFaction ZAAlpha
ZXAlphaRasmussenREF.RemoveFromFaction ZAAlpha
ZZXAlphaRonHammerRef01.RemoveFromFaction ZAAlpha
ZZAlphaJamesREF.RemoveFromFaction ZAAlpha
XYCRAlphaProtectronRechen01REF.RemoveFromFaction ZAAlpha
XYCRAlphaProtectronRechen02REF.RemoveFromFaction ZAAlpha
XYCRAlphaProtectronRechen03REF.RemoveFromFaction ZAAlpha
ZXAlphaProtectron01REF.RemoveFromFaction ZAAlpha
ZXAlphaProtectron02REF.RemoveFromFaction ZAAlpha
ZXAlphaProtectron03REF.RemoveFromFaction ZAAlpha
ZXAlphaProtectron04REF.RemoveFromFaction ZAAlpha

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

xAlphaDrGillesREF.AddtoFaction ZAAlphaEvil 1
ZXAlphaDrWattsref.AddtoFaction ZAAlphaEvil 1
xAlphaEdwardVandrossREF.AddtoFaction ZAAlphaEvil 1
xAlphaMariaVandrossREF.AddtoFaction ZAAlphaEvil 1
ZXAlphaRasmussenREF.AddtoFaction ZAAlphaEvil 1
ZZXAlphaRonHammerRef01.AddtoFaction ZAAlphaEvil 1
ZZAlphaJamesREF.AddtoFaction ZAAlphaEvil 1
XYCRAlphaProtectronRechen01REF.AddtoFaction ZAAlphaEvil 1
XYCRAlphaProtectronRechen02REF.AddtoFaction ZAAlphaEvil 1
XYCRAlphaProtectronRechen03REF.AddtoFaction ZAAlphaEvil 1
ZXAlphaProtectron01REF.AddtoFaction ZAAlphaEvil 1
ZXAlphaProtectron02REF.AddtoFaction ZAAlphaEvil 1
ZXAlphaProtectron03REF.AddtoFaction ZAAlphaEvil 1
ZXAlphaProtectron04REF.AddtoFaction ZAAlphaEvil 1
SetStage XDialogAlpha 200
Set Dead to -1
Endif
End

Edit:
Der Script liegt auf dem NPC.

Boïndil
21.05.2012, 16:58
Wenn du in einem Script auf den Actor Bezug nimmst, dem das Script gehört, reich das hier völlig aus:
If IsKiller Player == 1

RefIDs in Klammern auf der GECK-Seite bedeuten, dass sie optional sind. Ein Script nimmt ohne Referenz automatisch an, dass der eigene Actor gemeint ist.
[ActorRefID].IsKiller Killer:ref

Galerion
21.05.2012, 19:28
Hi Bondil, auf dich kann man ja hier zählen :cool:.

Ich habe mal alle Scripte abgeändert und gleich mal los getestet, ich weiß ja eigentlich das man die NPC-Referenz nicht in diese Abfrage einbauen muss. (Ist eher Gewohnheit bei mir, wieso auch immer:confused:)

Aber leider funktioniert der Script nach Tests noch immer nicht. Bei jeden 2-4 Mal wird der Script nicht abgespielt, woran liegts wohl? Hat damit schon irgend jemand Erfahrungen machen können?

Als nächstes werde ich es mit Begin onDeath probieren oder mit einer zusätzlichen GetDead Abfrage. Aber ich denke mal, dass sich das nichts bringt.

Boïndil
21.05.2012, 20:06
Hast du es denn schon mal innerhalb einer OnDeath-Abfrage gemacht?

Und wieso hast du eigentlich zwei GameModes drin?

Galerion
21.05.2012, 20:57
So hab einige andere Varianten ausprobiert wie ich vorher beschrieben habe, leider bekam ich nur das selbe Ergebnis oder es funktionierte gar nicht. Die 2 Gamemods sind nur zur Übersichtlichkeit drinnen, aber es geht ja rein um die Abfrage, warum erkennt das Spiel manchmal nicht wenn der Actor stirbt und der Spieler ihn getötet hat?

Boïndil
21.05.2012, 21:05
Ich glaube nicht, dass zwei Mal GameMode erlaubt ist, im Gegensatz etwa zu MenuMode X. Wenn man Probleme vermeiden möchte, sollte man sich an die Regeln halten. Vielleicht wählt ja Fallout zufällig einen GameMode oder immer den ersten aus und der eine ohne der andere kann nicht funktionieren.
Das Spiel erkennt auch so nicht immer alles 100%, z.B. auch IsInCombat oder so.

Galerion
21.05.2012, 21:14
Nein nein, da liegst du falsch. Du kannst soviele Gamemodes einbauen wie du willst, habe ich schon zu Evil Forces - Zeiten gemacht. Du kannst auch 25 Gamemodes reinmachen, muss man oft sogar, da es gar nicht anders möglich ist. Und schau doch mal den Script nochmal an, die 2. Gamemode wird erst dann gestartet wenn Dead auf 1 ist, oder was meinst du =)

Boïndil
21.05.2012, 21:20
Wahrscheinlich ist sonst noch ein Fehler drin.
Aber: es gibt weder eine Notwendigkeit, noch ist es gute Praxis, mehr als einen GameMode reinzutun. Ich sehe noch nicht mal einen Grund, auszustesten, ob es vielleicht mit mehr als einem GameMode geht. Beim Programmieren sind Regeln keine Anregungen, sondern Notwendigkeit.
Eben: wenn sich das Spiel entscheidet, den zweiten GameMode nicht auszuwerten, dann hängt das Script im ersten.

Galerion
21.05.2012, 21:43
...
Eben: wenn sich das Spiel entscheidet, den zweiten GameMode nicht auszuwerten, dann hängt das Script im ersten.

Also ich hab festgestellt lieber mehr Gamemods reinzupacken, als wie zu viele Abfragen innerhalb eines Gamemodes zu setzen (Da ist in meinen Scriptbedürfnissen sehr bald die Grenze erreicht). Speziell bei Script-Sequenzen und andrem Zeug was umfangreicher ist, du kannst dir gerne die Scripte von EF mal ansehen. Vielleicht hältst du mich auch verrückt, aber Probleme werden dadurch keine verursacht. Ich habe auch insgesamt 400 Scripte nach dem Schema gemacht und jetzt bei Alpha auch wieder einige hundert^^

Edit: Aber ich will jetzt niemanden kritisieren der meint ein GameMode pro Quest reicht völlig aus (Und der es verteufelt mehre GameMods in einen Script reinzusetzen), dass verstehe ich auch voll und ganz auch ich habe gewisse Sachen die sich bewährt haben, was aber vielleicht auf erstem Blick etwas verwirrend ist und anders aussehen, aber wir kommen vom eigentlichen Thema ab, es geht eigentlich ja nur um die Abfrage ("iskiller Player") =)

Danke schon aber mal für deine Hilfe, für weitere Hilfestellungen bin ich weiter dankbar.

Carnatics
22.05.2012, 07:49
(NPC Reference.IsKiller Player == 1) also ich als voll horst frage mich grade wie zuverlässig die wert ausgabe bei dem befehl ist ...sprich ob 1 wirklich getroffen wird versuch doch mal ein != 0 statt des == 1
also wenn das script jetzt ne 1 oder ne 1.0001 ausspuckt sollte es so gehen

aber wie gesagt nur eine idee

Boïndil
22.05.2012, 08:16
(0, 1:int) [ActorRefID].IsKiller Killer:ref
Das Ding gibt auf jeden Fall eine Integer aus. Ich vermute eher, dass es mit dem getDisabled zu tun haben könnte. Vielleicht ein Referenz, die Initially Disabled ist?

Aaaaaimbot
22.05.2012, 12:01
Vielleicht feuert das Skript nicht, weil der Spieler den NPC mit einer vergifteten Waffe gekillt hat. Dann rafft das Spiel nämlich nicht, daß der Spieler der Killer war, sondern "das Gift auf der Waffe" ist dann der Killer. Oder auch wenn der Spieler ihn z.B. killt, indem er ihn von ner Klippe schmeißt oder ein Faß auf ihn herabfallen läßt, überhaupt, es gibt viele Möglichkeiten, wie der Spieler das Skript "austricksen" kann...

Galerion
22.05.2012, 17:30
(NPC Reference.IsKiller Player == 1) also ich als voll horst frage mich grade wie zuverlässig die wert ausgabe bei dem befehl ist ...sprich ob 1 wirklich getroffen wird versuch doch mal ein != 0 statt des == 1
also wenn das script jetzt ne 1 oder ne 1.0001 ausspuckt sollte es so gehen

aber wie gesagt nur eine idee

Wie Bondil schon geschrieben hat kommt da ne 1 raus wenn die Abfrage erfüllt wird und wenn nicht dann spuckt er eine 0 aus. Daran lag es also nicht, aber vielen Dank für die Hilfe. An der GetDisabled Abfrage lag es auch nicht, das Flag war richtig gesetzt.

Aaaaaimbot hatte recht, ziemlich viele Waffen in E-MOD haben einen zusätzlichen Effekt der den Spieler manchmal Schaden zufügt, sozusagen killt die Waffe (manchmal) den NPC und nicht der Spieler selbst, obwohl dieser eigentlich auf ihn geschossen hat. Also ist der Script-Befehl (IsKiller) erstmal für meine Zwecke unnütz. Danke für diesen Tipp, der Bug wurde schon langsam zum verzweifeln.

Zunächst habe ich es mit "GetCombatTarget (http://geck.bethsoft.com/index.php/GetCombatTarget)", "IsCombatTarget (http://geck.bethsoft.com/index.php/IsCombatTarget)" und "IsInCombat (http://geck.bethsoft.com/index.php/IsInCombat)" versucht. Diese Abfragen funktionierten, aber ich bekam keine richtigen Integer raus? Wisst ihr vielleicht woran dies lag? Also 0 und 1 stimmte nur teilweise.

Dann hab ich es mit "GetShouldAttack (http://geck.bethsoft.com/index.php/GetShouldAttack)" versucht und so hat es geklappt, sozusagen wird der Script jetzt ausgelöst wenn der NPC gegenüber den Spieler feindlich eingestellt ist und dies muss er ja sein, wenn er den NPC tötet. Erstmal werde ich es also lassen, bin aber für weitere Tipps sehr dankbar, zu guter letzt der Script für Interessierte.


SCN ZXAlphaRonHammerScript01

; --------------------------------------------------------------

Short Dead
Short CombatState

; --------------------------------------------------------------

Float Timer
Float TimerAbkling

; --------------------------------------------------------------

; NPC ist feindlich gegenüber den Spieler eingestellt und wenn er dann getötet wird, wird auch der Script ausgelöst.

Begin Gamemode
if (CombatState == 0) && (GetShouldAttack Player >= 1) && (ZZXMarkerAlphaisFrenzied01REF.GetDisabled == 0)
Set TimerAbkling to TimerAbkling + GetSecondsPassed
if (TimerAbkling >= 0.30) ; So bleibt CombatState beim Tot erhalten.
Set TimerAbkling to 0
Set CombatState to 1
Endif
Endif
if (CombatState == 1) && (GetShouldAttack Player == 0) && (ZZXMarkerAlphaisFrenzied01REF.GetDisabled == 0)
Set TimerAbkling to TimerAbkling + GetSecondsPassed
if (TimerAbkling >= 0.30) ; So bleibt CombatState beim Tot erhalten.
Set TimerAbkling to 0
Set CombatState to 0
Endif
Endif
End

; --------------------------------------------------------------

Begin Gamemode
if (Dead == 0) && (CombatState == 1) && (ZZXMarkerAlphaisFrenzied01REF.GetDisabled == 0) && (GetDead == 1)
Set Timer to Timer + GetSecondsPassed
if (Timer >= 2.5)
SetObjectiveDisplayed XDialogAlpha 200 3
ShowMessage ZZXAlphaPeopleareMurdered
Set Timer to 0
Set CombatState to -1
Set Dead to 1
Endif
Endif
End

; --------------------------------------------------------------

Begin Gamemode
if (Dead == 1)
ZZXMarkerAlphaisFrenzied01REF.Disable
xAlphaDrGillesREF.RemoveFromFaction ZAAlpha
ZXAlphaDrWattsref.RemoveFromFaction ZAAlpha
xAlphaEdwardVandrossREF.RemoveFromFaction ZAAlpha
xAlphaMariaVandrossREF.RemoveFromFaction ZAAlpha
ZXAlphaRasmussenREF.RemoveFromFaction ZAAlpha
ZZXAlphaRonHammerRef01.RemoveFromFaction ZAAlpha
ZZAlphaJamesREF.RemoveFromFaction ZAAlpha
XYCRAlphaProtectronRechen01REF.RemoveFromFaction ZAAlpha
XYCRAlphaProtectronRechen02REF.RemoveFromFaction ZAAlpha
XYCRAlphaProtectronRechen03REF.RemoveFromFaction ZAAlpha
ZXAlphaProtectron01REF.RemoveFromFaction ZAAlpha
ZXAlphaProtectron02REF.RemoveFromFaction ZAAlpha
ZXAlphaProtectron03REF.RemoveFromFaction ZAAlpha
ZXAlphaProtectron04REF.RemoveFromFaction ZAAlpha

; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

xAlphaDrGillesREF.AddtoFaction ZAAlphaEvil 1
ZXAlphaDrWattsref.AddtoFaction ZAAlphaEvil 1
xAlphaEdwardVandrossREF.AddtoFaction ZAAlphaEvil 1
xAlphaMariaVandrossREF.AddtoFaction ZAAlphaEvil 1
ZXAlphaRasmussenREF.AddtoFaction ZAAlphaEvil 1
ZZXAlphaRonHammerRef01.AddtoFaction ZAAlphaEvil 1
ZZAlphaJamesREF.AddtoFaction ZAAlphaEvil 1
XYCRAlphaProtectronRechen01REF.AddtoFaction ZAAlphaEvil 1
XYCRAlphaProtectronRechen02REF.AddtoFaction ZAAlphaEvil 1
XYCRAlphaProtectronRechen03REF.AddtoFaction ZAAlphaEvil 1
ZXAlphaProtectron01REF.AddtoFaction ZAAlphaEvil 1
ZXAlphaProtectron02REF.AddtoFaction ZAAlphaEvil 1
ZXAlphaProtectron03REF.AddtoFaction ZAAlphaEvil 1
ZXAlphaProtectron04REF.AddtoFaction ZAAlphaEvil 1
SetStage XDialogAlpha 200
Set Dead to -1
Endif
End

Boïndil
22.05.2012, 20:55
IsInCombat gibt auf jeden Fall nur 0 oder 1 aus. GetCombatTarget gibt hingegen bei einem Erfolg Referenzen aus, möglicherweise aber eine 0 oder -1 wenn kein Target zu eruieren ist.

Carnatics
23.05.2012, 04:30
öhm das einzige was mir jetz spontan einfällt ist es mit ner globalen variablen zu umgehen

sprich if NPC IsKiller.Player == 1
set GalerionVar to 10
if is GalerionVar == 10
do something funny
endif
endif
end

(oder so ähnlich)

und net vergessen die neue globale variable auch anzulegen ;)


und zwecks der todes ursache (gift oder so )
mal Hier reinsehen das spiel kann das wohl klassifizieren (http://geck.bethsoft.com/index.php/GetCauseofDeath)

Boïndil
23.05.2012, 06:34
Es kommt mir vor, wie wenn du recht kompliziert überlegst.

Kann der NPC überhaupt durch einen anderen NPC sterben? Macht es was aus, wenn nicht der Player, sondern ein Begleiter der Killer ist?
Wieso machst du das vom Marker abhängig? (ZZXMarkerAlphaisFrenzied01REF.GetDisabled)

Und das könnte wackelig sein: GetShouldAttack. Was passiert, wenn der Player den NPC durch einen Schleichtreffer sofort killt?

Carnatics
23.05.2012, 06:55
oder du machst betreffenden npc essential und haust im ein begin onhit player script um die ohren

so ist sichergestellt das auch wirklich nur der player der böse bub sein kann

böindli hat da was interessantes angeschnitten und zwar die marker geschichte.... kann ein marker überhaupt get dead ausgeben ?

ich meine klar rennt im game nachher der npc rum aber das script beschäftigt sich ja mit dem npc referenz marker und der geht ja net wirklich drauf...oder bin ich jetzt iwie auf dem holzweg ?!

Galerion
23.05.2012, 14:41
Sehr schön, wieder einige Antworten =)


öhm das einzige was mir jetz spontan einfällt ist es mit ner globalen variablen zu umgehen

sprich if NPC IsKiller.Player == 1
set GalerionVar to 10
if is GalerionVar == 10
do something funny
endif
endif
end

(oder so ähnlich)

und net vergessen die neue globale variable auch anzulegen ;)

Das mit den Variablen klingt sehr interessant, aber die helfen mir ja nicht wirklich weiter, ich kann außerdem die Abfrage "IsKiller.Player" nicht einbauen.

Gehen wir davon aus eine Kreatur hat 100 Lebenspunkte und die Waffe fügt mit Standard-Schaden 110 Schaden zu, dann stirbt die Kreatur und der Script wird ausgelöst. Wenn jedoch aber die Waffe nur 90 (Standard-Schaden) macht aber noch ein Gift-Effekt zum Beispiel oben wäre der 30 Schaden verursacht, dann ist die Waffe der Mörder und nicht der Spieler.



und zwecks der todes ursache (gift oder so )
mal Hier reinsehen das spiel kann das wohl klassifizieren (http://geck.bethsoft.com/index.php/GetCauseofDeath)

Ist auch ein sehr interessanter Lösungsvorschlag aber eingentlich hilft er mir nicht, da zum Beispiel in meinen Fall ein Geschützturm oder ein Supermutant den entsprechenden NPC töten könnte und diese ja dann auch mit Waffen schießen oder?



Es kommt mir vor, wie wenn du recht kompliziert überlegst.

Jo, dass ist gut möglich^^



Kann der NPC überhaupt durch einen anderen NPC sterben? Macht es was aus, wenn nicht der Player, sondern ein Begleiter der Killer ist?


Die NPC´s (Der Script ist mehrfach etwas abgeändert auf einige NPC´s verteilt.) können eigentlich nicht durch einen anderen NPC sterben, außer durch Begleiter von dem Spieler. Die größere Gefahr liegt bei Geschütztürmen, Mutanten und Ameisen, da sollte der Script dann natürlich nicht ausschlagen wenn er stirbt.



Wieso machst du das vom Marker abhängig? (ZZXMarkerAlphaisFrenzied01REF.GetDisabled)


Dieser XMarker ist normal "Enabled" und wird dann "Disabled" wenn der Script ausgeführt wurde, die Abfrage fragt also nur nach ob der Script schonmal irgendwo abgefragt wurde. Hat der Spieler also NPC 1 getötet wird der Script abgespielt, wenn er dann auch NPC 2 tötet wird er nicht mehr abgespielt. Ersetzt sozusagen eine Globale-Variable. Dies mache ich auch öfters so, weil es für mich einfach und zweckmäßig ist. Keine Angst manchmal nutze ich auch Globale-variablen.^^




Und das könnte wackelig sein: GetShouldAttack. Was passiert, wenn der Player den NPC durch einen Schleichtreffer sofort killt?
Das ist wieder sehr interessant, über dass habe ich noch nicht nachgedacht. Wird zum testen werden, ob es auch bei Schleichtreffern klappt. Aber die NPC sind ja eigentlich mit ziemlich viel Lebenspunkten ausgestattet, jedoch speziell für höhere Charaktere könnte dies dann passieren. Aber eventuell funktioniert die Abfrage trotzdem, mal sehen.



oder du machst betreffenden npc essential und haust im ein begin onhit player script um die ohren

so ist sichergestellt das auch wirklich nur der player der böse bub sein kann


Das wäre dann wieder eine größere Änderung an der eigentlichen Idee, wir wollen das der Spieler die Freiheit hat NPC´s zu töten, aber dann wenn er das macht muss er auch mit den Konsequenzen rechnen. Fehlschlagen der Quest, abschottung der Level etc. Wenn er zum Beispiel jetzt versehentlich auf den NPC schießt ist es auch wieder blöd :cool: Dann muss man wieder viele Texte abändern etc. etc. außerdem scheint es ja derzeit ganz gut zu klappen.



böindli hat da was interessantes angeschnitten und zwar die marker geschichte.... kann ein marker überhaupt get dead ausgeben ?

ich meine klar rennt im game nachher der npc rum aber das script beschäftigt sich ja mit dem npc referenz marker und der geht ja net wirklich drauf...oder bin ich jetzt iwie auf dem holzweg ?!

Ich weiß jetzt nicht genau was du meinst, ich erkläre nochmal kurz die Abfragezeile so wie ich mir das vorstelle:

"if (Dead == 0) && (CombatState == 1) && (ZZXMarkerAlphaisFrenzied01REF.GetDisabled == 0) && (GetDead == 1)"

"(Dead == 0)" = Der Script am NPC wird nur einmal abgespielt.
"(CombatState == 1)" = Wenn der NPC gegenüber den Spieler aggressiv eingestellt ist wird der Script abespielt.
"(ZZXMarkerAlphaisFrenzied01REF.GetDisabled == 0)" = Wenn dieser Marker auf 0 (Enabled) ist wird der Script abgespielt, wenn er auf 1 (Disabled) ist, wird er nicht mehr abgespielt. Es gibt noch andere NPC´s in den Level, die vom Grund her einen ähnlichen Script haben und sich nur marginal unterscheiden, diese Scripte werden dann nachdem er einmal ausgelöst wurde nicht mehr abgespielt. Sonst würde es sich die ganze Prozedur bei jedem NPC wiederholen.
"(GetDead == 1)" = Wird erfüllt wenn der NPC getötet wird. Auf welchem der Script liegt. (Hat nix mit dem XMarker "ZZXMarkerAlphaisFrenzied01REF" zu tun.

-----------

Wenn dann ist aber eigentlich zu hinterfragen ob GetShouldAttack die richtige bzw. für meine Verhältnisse die beste Wahl ist.

Boïndil
23.05.2012, 14:50
Hatte irgendwie gar nicht mehr gedacht, dass ich ja das hier verwende:


If IsDead == 0 && GetDead == 1 && IsKiller Player == 1
Set wlwGenericQuest.KillsAllAnimals To wlwGenericQuest.KillsAllAnimals + 1
Set wlwGenericQuest.KillsDeathClaws To wlwGenericQuest.KillsDeathClaws + 1
Set IsDead To 1
EndIf
Das ist ein Sript, das jeder Actor bei mir trägt. Ich ahbe zwar keine Ahnung, wie genau das ist, aber ich kriege meine Erfolge früher oder später.
Ich hatte zwar mal ein Script, indem eine Message-Box angezeigt wurde, wenn der Player den gekillt hat. Das hat tatsächlich nicht immer gefeuert, vor allem, wenn Begleiter dabei waren. Vielleicht muss ein gewisser Prozentsatz der Gesundheit vom Player abgezogen werden, damit es feuert.

Wieso verwendest du Marker als 1|0-Variablen, wenn du die im Script haben kannst?
Nebenbei: heute würde ich keine Globals mehr verwenden, sondern nur noch Script-Variablen, da Globals teilweise resetet werden, wenn man einen Mod updatet oder einen anderen installiert.

Galerion
23.05.2012, 15:12
Sehr interessanter Script, werden diese Erfolge dann bei den Lade-Bildschirmen angezeigt? Naja, wie ich das jetzt mit "isKiller" verstanden habe wird diese Abfrage nur dann erfüllt wenn du ihn auch tatsächlich getötet hast, ihm (Player Ref) sozusagen also die letzten Lebenspunkte abgezogen hast.

XMarker Variablen nutze ich dann wenn ich Scripte vernetzen möchte, dies ist ja nur 1 von 10 Scripten, wie hättest du es (aus reiner Neugier) geregelt? Mit "GetScriptVariable"?

Nutze ich selten auch mal, aber lieber hab ich generel XMarker.

Edit: Nachteile der XMarker und "GetDisabled" sind halt das mehr Referenzen gebraucht werden.

Boïndil
23.05.2012, 15:25
Ich habe selbst Zähler für alle relevanten Actors eingerichtet, z.B. kriegt man beim Killen von 20 Aliens oder Trogs je einen Perk zur Belohnung.

Das vernetzen ist an sich Peace:
Set MyCounter to MyQuest.MyCounter (irgendein Script > Quest-Script)
Set ActorHits To ActorXRef.ActorHits (irgendein Script > Actor-Script)

Oder eben wie oben, wo ich aus einem ActorEffect-Script eine Quest-Variable update:
Set wlwGenericQuest.KillsDeathClaws To wlwGenericQuest.KillsDeathClaws + 1

Wenn du eine persistente Referenz mit einem Script drauf hast, kannst du auch jederzeit aus einem anderen Script darauf zugreifen.

Das hier ist ein Script, mit dem ich aus einer Quest den Zustand eines wiederverwendbaren LeaderXRef neu setze:

If CurrentGroup == 1
Set wlwQuestAmbushLeader1Ref.SpawnState To 0
ElseIf CurrentGroup == 2
Set wlwQuestAmbushLeader2Ref.SpawnState To 0

Der Leader durchläuft dann selbständig wieder die SpawnStates bis 4 und wird dann wieder resetet.

Galerion
23.05.2012, 15:46
Ja, ich verstehe was du meinst, nunja ist eher Ansichtssache wie man es am besten macht und man muss auch ein bisschen unterscheiden. Wie ich bemerkt habe moddest du ja eher an Overhauls und Gameplay-Veränderungen wo du am ganzen Wasteland herumtüfftelst, da würde ich jetzt auch nicht mit einer (GetDisabled) Abfrage beginnen, so wie ich es gemacht habe. Da kann man dann schon bald den Überblick verlieren. Aber ich modde ja meistens nur in geschlossenen Zonen mit wenig Einfluss auf die Umwelt, da reichen dann schon ein paar Quests, Xmarker und andere Abfragen und selten vielleicht eine Globale auch wenns für eingefleischte Scripter vielleicht Umständlich aussieht. :)

Boïndil
23.05.2012, 17:28
Liegt wahrscheinlich daran, dass ich es hasse, mit diesem verdammten Render-Fenster from hell irgend was zu machen. Selbst XMarker zu setzen, kotzt mich an :-)
Und da ich viele Änderungen mache, musste ich mich darauf trainieren, effizient zu sein und alles zu scripten, was geht, wobei ich schon morgens um halb 6 vor dem ersten Kaffee effizienter bin, als die Jungs von Obsidian und Bethesda ;-)

Carnatics
23.05.2012, 18:08
wobei ich schon morgens um halb 6 vor dem ersten Kaffee effizienter bin, als die Jungs von Obsidian und Bethesda ;-)

sollte es dann im script editor nicht heissen ReBoïndil all scripts ? anstelle von Recompile all scripts ? xD


so zum problem es gibt ja bei npcs die option track crime
wenn du jetzt dem "opfer npc" nen freun bastelst irgendwo in einer cell wo man net erreicht
den mit der option trck crime ausstattest und in die script abfrage "get hostile" einbaust die nur checkt ob der freund des opfer npcs dir feindlich gesinnt ist...okay jetzt nochmal verständlich

opferNpc rennt frei rum
freund des opfer npc in ner geschlossenen cell

freund des opfer npc hat ne track crime flag

player oder companion killt den opfer npc

der freund des opfer npc wird krantig(sauer)

und das script startet weil der nun hostile dir gegenüber ist...

Galerion
24.05.2012, 17:01
sollte es dann im script editor nicht heissen ReBoïndil all scripts ? anstelle von Recompile all scripts ? xD


lol :D;):D

---

Nun zu deinen anderen Lösungsvorschlag, den du vorgebracht hast. Wenn ich das richtig verstanden habe willst du über den anderen NPC abfragen ob der NPC (welcher getötet wird feindlich gesinnt ist). Nunja ich verstehe den Sinn des ganzen nicht so wirklich?

Es geht ja darum das der NPC (Der getötet werden kann.) gegenüber den Spieler feindlich sein soll und nicht irgendwelchen anderen Partein. Dies wird ja jetzt genau auch so abgefragt. Schau dir nochmal den Script an.

Außerdem kann ein Begleiter nicht von selbst einfach den NPC (der getötet werden kann) angreifen, da muss ja der Spieler schon erstmal auf ihn schießen oder? Und so wird dann ja der Script am Ende auch ausgeführt.

Ich werde in naher Zukunft nochmal testen wie der Script derzeit in verschiedenen Situationen funktioniert und euch dann Bericht erstatten, aber rein vom Gedanken her müsste es ja jetzt in Ordnung sein.

Danke aber nochmal für eure Hilfestellungen.

Edit:
Hier nochmal eine Diskussion von der Oblivion Wiki-Seite, wo darüber gesprochen wird, wenn man mehrere Gamemodes in einem Script verwendet bin genau derselben Meinung.
http://cs.elderscrolls.com/index.php/Talk:GameMode