Construction Set NPC- Einstellungen Kampfverhalten

Nexon

Bürger
Ich habe das Problem, dass mich ein paar NPC's, die ich erstellt habe angreifen, aber nicht mehr damit aufhören. Ich möchte gern, dass sie nach einer Zeit aufhören den Spieler zu verfolgen und an einen bestimmten Ort wieder zurückkehren.

Wie müsste ich das machen?
 
nur so eine kurze idee: per script die entfernung zwischen dem npc und diesem "bestimmten ort" prüfen, und wenn die entfernung zu groß ist, die aggressivität des npcs verringern bzw. auf null setzen?
 
Hmm klingt nach ner guten Idee, aber ich dachte halt das geht irgendwie einfach und nicht wieder über 5 Ecken gedacht.

Naja auf jedenfall hab ich mich mal am Script versucht und das hier geschrieben:

Code:
scn ACassassinsDistanceScript

short dist
ref Actor

begin GameMode
set Actor to this
set dist to ACXmarker.GetDistance  Actor
if (dist >= 20)
	Actor.setav Aggression 0
	Actor.StopCombat
endif
If (dist <=1)
	Actor.setav Aggression 20
endif
end

Funktioniert aber leider nicht. Kann wer nen Fehler erkennen? Oder hat wer noch ne andere Idee?
 
Passiert so überhaupt nichts?
Ich würde mal Actor.GetDistanze ACXmarker schreiben oder liegt das Script auf dem Marker?
Und was soll die Zeile "Set Actor to this" bringen?

Ich glaube, ich würde auch eher abfragen, wie weit der Spielr vom Marker entfernt ist und das Script danach ausrichten. Bei dir dürfte das mit der Aggression nicht richtig laufen.
Also etwa so:
Spieler Entfernung zu Marker <= 20, NPC Aggression auf x
--> NPC attakiert Spieler
Spieler Entfernung zu Marker > 20, NPC Aggression auf y
--> NPC geht zurück zu Marker
 
Jo so passiert garnix zurzeit.

Das Script liegt auf den NPC's selber und deswegen auch "set Actor to this" this verweist auf den NPC selber. Ich hätte auch "set Actor to getself" schreiben können.

Das mit dem Spieler kann ich mal probieren, finde ich aber nicht passend.

"ACXmarker.GetDistance Actor" hab ich genommen, da in der Wiki stand, dass der zurückgegebene Wert genauer ist, fals die Distanz zwischen dem Ziel und dem Objekt über mehrere Zellen erstreckt.
 
Wenn du SI hast könntest du dir mal das Skript vom Torwächter anschauen, der macht genau das was du willst.

Man könnte das aber auch mit einer Trigger-Box machen, wenn sich der Spieler darin befindet, dann greift der NPC an.
 
Si hab ich leider nicht, aber eigentlich muss es doch auch mit dem Script gehen. Ich kann bloß keinen Fehler entdecken irgendwie.
 
Also, wenn ich mir diesen Script so ansehe, dürfen die Npc's sobald der Script startet, sofort aufhören, dich anzugreifen.

20 Oblivion Units sind etwa 1/3 eines Meters.
 
Also, wenn ich mir diesen Script so ansehe, dürfen die Npc's sobald der Script startet, sofort aufhören, dich anzugreifen.

20 Oblivion Units sind etwa 1/3 eines Meters.

Ja ich weiß, aber sie tun es leider nicht. :?

Ich hatte vorher nen größeren Wert. Ich glaub 200 oder so. Ich werd nochma bisschen rumtesten.

EDIT:

Ich hab das Probelm gefunden, aber leider nicht die Lösung. Und zwar liegt es an GetDistance selber. Sobald ich das irgendwo ins Script schreibe, wird es einfach nicht mehr ausgeführt. Ich hab das Script mal so vereinfach und getestet:

Code:
scn ACassassinsDistanceScript

short dist
ref Actor

begin GameMode
set Actor to ACassassins1
set dist to ACXmarker.GetDistance Actor
Message "blubb"
end

Das Script wird nicht ausgeführt. Wenn ich "set dist to ACXmarker.GetDistance Actor" weglasse, dann geht es. Das hier hab ich auch schon probiert.

Code:
scn ACassassinsDistanceScript

ref Actor

begin GameMode
set Actor to ACXmarker
if GetDistance Actor >=20
[INDENT]Message "blubb"[/INDENT]
else
[INDENT]Message "blubb2"[/INDENT]
endif
end

Funktioniert auch nicht. Jemand ne Idee woran das liegen könnt, dass das Script garnicht ausgeführt wird?
 
Zuletzt bearbeitet:
GetDistance does not return reliably in worldspaces when the target is a non-actor in a different cell. For instance, Player.GetDistance Object may not give the correct distance, whereas Object.GetDistance Player consistently does.
Retrieved from "http://cs.elderscrolls.com/constwiki/index.php/GetDistance"

Ich weiß nicht, ob das Cs in diesem Falle, den Spieler als Actor rechnet oder nicht, manchmal macht es das eine, manchmal das andere.
 
Naja der Spieler hat ja zurzeit nix mit dem Script zutun, da ich nen NPC abfrage. Aber ich habs auch schon mit dem Player gemacht, ändert leider nichts.
 
bleiben wir mal bei der einfachen Variante, denn dazu hätte ich eine Frage:
Code:
scn ACassassinsDistanceScript

short dist
[COLOR="red"]ref Actor[/COLOR]

begin GameMode
[COLOR="Red"]set Actor to ACassassins1[/COLOR]
set dist to ACXmarker.GetDistance Actor
Message "blubb"
end
Den rt markierten Teil verstehe ich nämlich nicht.
Acassassins1 ist doch eine Referenz, oder? Wenn ja, brauchst du dieser Referenz nicht noch mal eine (im Script erzeugte) Referenz zuweisen.

Demnach evtl so:
Code:
scn ACassassinsDistanceScript

short dist

begin GameMode
set dist to ACXmarker.GetDistance ACassassins1
Message "blubb"
end
btw.: Worauf liegt eigentlich der Script?
 
bleiben wir mal bei der einfachen Variante, denn dazu hätte ich eine Frage:
Code:
scn ACassassinsDistanceScript

short dist
[COLOR="red"]ref Actor[/COLOR]

begin GameMode
[COLOR="Red"]set Actor to ACassassins1[/COLOR]
set dist to ACXmarker.GetDistance Actor
Message "blubb"
end
Den rt markierten Teil verstehe ich nämlich nicht.
Acassassins1 ist doch eine Referenz, oder? Wenn ja, brauchst du dieser Referenz nicht noch mal eine (im Script erzeugte) Referenz zuweisen.

Demnach evtl so:
Code:
scn ACassassinsDistanceScript

short dist

begin GameMode
set dist to ACXmarker.GetDistance ACassassins1
Message "blubb"
end
btw.: Worauf liegt eigentlich der Script?

GetDistance verlangt eine Ref Variable als Objekt ID, deswegen hab ich das so geschrieben.

Die Variante die du vorgeschlagen hast kann ich nicht speichern, da ich einen Error bekomme.

Der Script läuft auf den NPC's, wie Knochenkeule schon gesagt hat.

Das war das ursprüngliche Script übrigens:

Code:
scn ACassassinsDistanceScript

short dist
ref Actor

begin GameMode
set Actor to this
set dist to ACXmarker.GetDistance  Actor
if (dist >= 20)
	Actor.setav Aggression 0
	Actor.StopCombat
endif
If (dist <=1)
	Actor.setav Aggression 20
endif
end

Daraus entnehme ich, dass er auf den NPCs liegt.
Ich würde es allerdings eher auf den Marker legen. Natürlich dann in anderer Form.

Das ist aber nicht wirklich gut, da ich dann für 5 NPC's das Script anpassen muss. Mit meiner Variante brauch ich nur 1 Script das für alle NPC's allgemeingültig ist. Das sollte sogar bei allen Oblivion NPC's funkionieren, wenn ich es auf sie lege.

Ich weiß auch nicht woran es liegt. Kann es vielleicht sein das der GameMode Block auf NPC's nicht durchgängig ausgeführt wird? Obwohl das kanns auch nicht sein. Ich hatte das ganze schon mit nem OnDeath block gemacht und da gabs auch keine Message ausgabe....
 
Hmm, mach doch mal einen Test, nimm den Marker und leg auf ihn den Script

Code:
scn blubb

Begin GameMode
Message "Blablabla"
end

Wenn die Message nun nicht die ganze Zeit angezeigt bekommst, hast du ein Problem.
 
Grad gemacht. Ich bekomm ne Dauerausgabe also liegts daran auch nicht. Das macht mich langsam alles fertig. Ich arbeite grad an einem ganz andere Script, dass mit dem hier garnix zutun hat und ich hab da schon wieder sowas total seltsames.Oo
 
Code:
scn ACassassinsDistanceScript


begin GameMode

if Getdistance ACXmarker >= 200
	Actor.setav Aggression 0
	Actor.StopCombat

Elseif Getdistance ACXmarker <= 40
	Actor.setav Aggression 20
endif

end
Ich habe short und die ref entfernt, da beide nicht von Nöten waren. Außerdem habe ich die units auf etwas höhere Werte geschraubt.