Also manchmal bringen mich diese Scripte hart an die Grenze meines Hirns oder überschreiten sie ab und zu.
Bin nochmals daran, die Karawanen zu überarbeiten und das beste rauzuholen, unter Berücksichtigung von Aspekten wie Stabilität, Performance und realistischem Verhalten.
Und da müssen mehrere lange Scripte und Actors mit verschiedenem Verhalten synchronisiert werden und zwar so, dass auf jeden Fall abgebrochen wird, wenn unvorhersehbare Dinge auftreten.
Im Prinizp wird in einem definierbaren Intervall eine Karawane aufgerufen, die solange ihre Kreise durchs Ödland zieht, wie der Player sich in der Nähe befindet.
Ist eine Karawane am Ziel, z.B. in der Republik von Dave, angekommen, sollen alle Mitglieder der Karawane auf Sandbox wechseln, bis sie nach einiger Zeit ein neues unter 10 Zielen auslosen und sich wieder vereinigen. Funktioniert an sich vernünftig, aber optimieren kann man immer. Habe natürlich alles hinter Intervalle gesetzt, damit Distanz-Abfragen zum Player nur alle 20 Sekunden gemacht werden.
Allerdings sollten sie schneller zur Sandbox und zurück wechseln, da es seltsam aussieht, wenn sie 20 Sekunden wie die Ölgötzen da stehen, bevor sie in die Sandbox gehen.

An den verstärkten Vanilla-Karawanen muss ich auch nochmals schleifen. Das funktioniert irgendwie nicht richtig, dass man ihnen das Sandbox-Paket wieder per Script nimmt, obwohl es folgerichtig wäre, dass sie das Folgen-Package wieder aufnehmen, das sie als Basis haben. Ich versuche, das möglichst generisch zu halten, um für Hoff möglichst wenig andere Packages, als für Crow zu brauchen.
Auf jeden Fall sieht es da so aus, dass das Brahmin jeder Karawane der Spawnpunkt für Karawanen-Begleiter vom Hund bis zum Sammler ist. Wenn sich der Player in der Nähe befindet, wird gespawnt, ansonsten wieder entfernt, um die Performance nicht unnötig zu belasten.

Falls jemand mal reinsehen möchte, hier das Script, das jeder Karawanenführer hat.
scn wlwQuestCarawanActorsLeaderScript
Spoiler:
Code:
; Script fuer alle Karawanen-Fuehrer
short SpawnID
short SpawnDay
short SpawnState
short SpawnRate
float SpawnInterval
float SpawnTimeOut
short HasSpawned
short SpawnCount
ref CarawanRef
; Random-Werte
short Random0				; 0-2
short Random1				; 1-3
short Random2				; 3-5
short Random3				; 5-7
; Karawanen-Definition
short UseDoctors
short UseGuards
short UseTechs
short UseScavengers
short UseBrahminDrovers
short UseMoleratDrovers
short UseTravellers
short UsePackBrahmins
short UseDogs
short UseYaoGuai
short AnimalsMax
short AnimalsCount
short WaitState
; Doktor-Variablen
short	BeginMedicalServices
short	BeginAddictionServices
short	DocServiceOnce
float	DocTimer

Begin OnLoad
	Set SpawnInterval To 5
End

Begin GameMode

	; Ueberwachungsfunktionen
	If SpawnState == 0 && wlwQuestCarawan.CanSpawn == 2
		If SpawnInterval < 0
			Set CarawanRef To GetSelf
			Set SpawnTimeOut To 10
			Set SpawnID To wlwQuestCarawan.CarawanID
			Set SpawnRate To wlwQuestCarawan.SpawnRate
			Set SpawnCount To 0
			If SpawnRate < 1
				Set SpawnRate To 1
			EndIf
			; Randoms ermitteln
			Set Random0 To (GetRandomPercent / 30) ; 0 - 3
			Set Random1 To SpawnRate + (GetRandomPercent / 40)
			Set Random2 To SpawnRate + (GetRandomPercent / 30)
			Set Random3 To SpawnRate + (GetRandomPercent / 20)
			Set AnimalsMax To 10
			Set AnimalsCount To 0
			; Karawanen-Definition
			Set UseDoctors To 0
			Set UseGuards To 0
			Set UseTechs To 0
			Set UseScavengers To 0
			Set UseBrahminDrovers To 0
			Set UseMoleratDrovers To 0
			Set UseTravellers To 0
			Set UsePackBrahmins To 0
			Set UseDogs To 0
			Set UseYaoGuai To 0
			If SpawnID == 1		; Mad Watz (Schrottsammler)
				Set UseScavengers To Random1
				Set UsePackBrahmins To Random1
				Set UseYaoGuai To 1
				Set UseDogs To Random0
				Set UseTravellers To Random0
			ElseIf SpawnID == 2	; John Maddog (Arzt)
				Set UseDoctors To Random1
				Set UsePackBrahmins To Random1
				Set UseDogs To 2
				Set UseTravellers To Random0
				Set UseGuards To Random0
			ElseIf SpawnID == 3	; Will Greenspot(Waffenhaendler)
				Set UseGuards To Random1
				Set UseTechs To 1
				Set UsePackBrahmins To Random1
				Set UseDogs To Random0
				Set UseTravellers To Random0
			ElseIf SpawnID == 4	; Sweet Kate (Nahrung, Schnaps)
				Set UseScavengers To Random1
				Set UsePackBrahmins To Random1
				Set UseYaoGuai To 1
				Set UseDogs To Random0
				Set UseTravellers To Random0
			ElseIf SpawnID == 5	; Utha "Steelfists" Gerdman (Waffenhaendlerin)
				Set UseGuards To Random1
				Set UseTechs To 1
				Set UsePackBrahmins To Random1
				Set UseTravellers To Random0
				Set UseYaoGuai To 1
			ElseIf SpawnID == 6	; Megan McKieran (Alkohol)
				Set UseGuards To Random0
				Set UsePackBrahmins To Random1
				Set UseDogs To Random0
				Set UseTravellers To Random1
			ElseIf SpawnID == 7	; Molerat Dundee(Ratten-Haendler)
				Set UseScavengers To Random1
				Set UsePackBrahmins To 1
				Set UseDogs To Random1
				Set UseMoleratDrovers To Random1
			ElseIf SpawnID == 8	; Buffalo Sue(Brahmin-Viehtreiberin)
				Set UseScavengers To 1
				Set UseTravellers To Random1
				Set UsePackBrahmins To 1
				Set UseDogs To Random1
				Set UseBrahminDrovers To Random1
			EndIf
			Set SpawnInterval To 5
			Set SpawnState To 1
		Else
			Set SpawnInterval To SpawnInterval - GetSecondsPassed
		EndIf
	EndIf
	
	; Karawane erstellen
	If SpawnState == 1
		Set HasSpawned To 0
		If UseDoctors > 0
			PlaceAtMe wlwQuestCarawanMaleDoc 1
			Set UseDoctors To UseDoctors - 1
			Set SpawnCount To SpawnCount + 1
			Set HasSpawned To 1
		EndIf
		If UseGuards > 0
			If GetRandomPercent < 50
				PlaceAtMe wlwQuestCarawanMaleGuard 1
			Else
				PlaceAtMe wlwQuestCarawanFemaleGuard 1
			EndIf
			Set UseGuards To UseGuards - 1
			Set SpawnCount To SpawnCount + 1
			Set HasSpawned To 1
		EndIf
		If UseTechs > 0
			If GetRandomPercent < 50
				PlaceAtMe wlwQuestCarawanMaleTech 1
			Else
				PlaceAtMe wlwQuestCarawanFemaleTech 1
			EndIf
			Set UseTechs To UseTechs - 1
			Set SpawnCount To SpawnCount + 1
			Set HasSpawned To 1
		EndIf
		If UseScavengers > 0
			If GetRandomPercent < 50
				PlaceAtMe wlwQuestCarawanMaleScavenger 1
			Else
				PlaceAtMe wlwQuestCarawanFemaleScavenger 1
			EndIf
			Set UseScavengers To UseScavengers - 1
			Set SpawnCount To SpawnCount + 1
			Set HasSpawned To 1
		EndIf
		If UseBrahminDrovers > 0
			If GetRandomPercent < 50
				PlaceAtMe wlwQuestCarawanMaleBrahminDrover 1
			Else
				PlaceAtMe wlwQuestCarawanFemaleBrahminDrover 1
			EndIf
			Set UseBrahminDrovers To UseBrahminDrovers - 1
			Set SpawnCount To SpawnCount + 1
			Set HasSpawned To 1
			If AnimalsCount < AnimalsMax
				PlaceAtMe wlwQuestCarawanBrahmin Random1
				Set SpawnCount To SpawnCount + Random1
				Set AnimalsCount To AnimalsCount + Random1
			EndIf
		EndIf
		If UseMoleratDrovers > 0
			If GetRandomPercent < 50
				PlaceAtMe wlwQuestCarawanMaleMoleRatDrover 1
			Else
				PlaceAtMe wlwQuestCarawanFemaleMoleRatDrover 1
			EndIf
			Set UseMoleratDrovers To UseMoleratDrovers - 1
			Set SpawnCount To SpawnCount + 1
			Set HasSpawned To 1
			If AnimalsCount < AnimalsMax
				PlaceAtMe wlwQuestCarawanMoleRat Random1
				Set SpawnCount To SpawnCount + Random1
				Set AnimalsCount To AnimalsCount + Random1
			EndIf
		EndIf
		If UseTravellers > 0
			If GetRandomPercent < 50
				PlaceAtMe wlwQuestCarawanMale 1
			Else
				PlaceAtMe wlwQuestCarawanFemale 1
			EndIf
			Set UseTravellers To UseTravellers - 1
			Set SpawnCount To SpawnCount + 1
			Set HasSpawned To 1
		EndIf
		If UsePackBrahmins > 0
			PlaceAtMe wlwQuestCarawanBrahminPack UsePackBrahmins
			Set SpawnCount To SpawnCount + UsePackBrahmins
			Set UsePackBrahmins To 0
		EndIf
		If UseDogs > 0
			PlaceAtMe wlwQuestCarawanDog UseDogs
			Set SpawnCount To SpawnCount + UseDogs
			Set UseDogs To 0
		EndIf
		If UseYaoGuai > 0
			PlaceAtMe wlwQuestCarawanYaoGuai UseYaoGuai
			Set SpawnCount To SpawnCount + UseYaoGuai
			Set UseYaoGuai To 0
		EndIf
		If HasSpawned == 0
			Set SpawnCount To SpawnCount + 1
			Set SpawnState To 2
		EndIf
	EndIf
	
	; Haendler reseten
	If SpawnState == 2
		If SpawnTimeOut < 0
			ResetHealth
			ResetInventory
			If SpawnID == 1
				wlwQuestCaravanItemsLeaderRef1.ResetInventory
				wlwQuestCaravanContainerLeaderRef1.RemoveAllItems
				wlwQuestCaravanItemsLeaderRef1.RemoveAllItems wlwQuestCaravanContainerLeaderRef1
			ElseIf SpawnID == 2
				wlwQuestCaravanItemsLeaderRef2.ResetInventory
				wlwQuestCaravanContainerLeaderRef2.RemoveAllItems
				wlwQuestCaravanItemsLeaderRef2.RemoveAllItems wlwQuestCaravanContainerLeaderRef2
			ElseIf SpawnID == 3
				wlwQuestCaravanItemsLeaderRef3.ResetInventory
				wlwQuestCaravanContainerLeaderRef3.RemoveAllItems
				wlwQuestCaravanItemsLeaderRef3.RemoveAllItems wlwQuestCaravanContainerLeaderRef3
			ElseIf SpawnID == 4
				wlwQuestCaravanItemsLeaderRef4.ResetInventory
				wlwQuestCaravanContainerLeaderRef4.RemoveAllItems
				wlwQuestCaravanItemsLeaderRef4.RemoveAllItems wlwQuestCaravanContainerLeaderRef4
			ElseIf SpawnID == 5
				wlwQuestCaravanItemsLeaderRef5.ResetInventory
				wlwQuestCaravanContainerLeaderRef5.RemoveAllItems
				wlwQuestCaravanItemsLeaderRef5.RemoveAllItems wlwQuestCaravanContainerLeaderRef5
			ElseIf SpawnID == 6
				wlwQuestCaravanItemsLeaderRef6.ResetInventory
				wlwQuestCaravanContainerLeaderRef6.RemoveAllItems
				wlwQuestCaravanItemsLeaderRef6.RemoveAllItems wlwQuestCaravanContainerLeaderRef6
			ElseIf SpawnID == 7
				wlwQuestCaravanItemsLeaderRef7.ResetInventory
				wlwQuestCaravanContainerLeaderRef7.RemoveAllItems
				wlwQuestCaravanItemsLeaderRef7.RemoveAllItems wlwQuestCaravanContainerLeaderRef7
			ElseIf SpawnID == 8
				wlwQuestCaravanItemsLeaderRef8.ResetInventory
				wlwQuestCaravanContainerLeaderRef8.RemoveAllItems
				wlwQuestCaravanItemsLeaderRef8.RemoveAllItems wlwQuestCaravanContainerLeaderRef8
			EndIf
			If GetInFaction wlwQuestCarawanFactionGroup == 0
				AddToFaction wlwQuestCarawanFactionGroup 1
			EndIf
			If GetInFaction wlwQuestCarawanFactionLeader == 0
				AddToFaction wlwQuestCarawanFactionLeader 1
			EndIf
			RemoveScriptPackage wlwQuestCarawanWait
			AddScriptPackage wlwQuestCarawanFollowSlot1
			If GetAv SpeedMult < 110
				SetAv SpeedMult 110
			EndIf
			Evp
			PlaySound AMBElevatorBell
			If wlwQuestCarawan.DebugCarawan == 1
				ShowMessage wlwQuestCarawanStartMsg SpawnID SpawnCount
			Else
				ShowMessage wlwQuestCarawanDetectedMsg
			EndIf
			Set SpawnState To 3
		Else
			Set SpawnTimeOut To SpawnTimeOut - GetSecondsPassed
		EndIf
	EndIf
	
	; Ueberwachungsfunktionen
	If SpawnState == 3

		; Warten
		If wlwQuestCarawan.IsAtDestination == 1 && WaitState == 0
			AddScriptPackage wlwQuestCarawanWaitSandbox
			Set WaitState To 1
			Evp
		ElseIf wlwQuestCarawan.IsAtDestination == 0 && WaitState == 1 
			RemoveScriptPackage wlwQuestCarawanWaitSandbox
			If GetInFaction wlwQuestCarawanFactionSlot4 == 1
				AddScriptPackage wlwQuestCarawanFollowSlot4
			ElseIf GetInFaction wlwQuestCarawanFactionSlot3 == 1
				AddScriptPackage wlwQuestCarawanFollowSlot3
			ElseIf GetInFaction wlwQuestCarawanFactionSlot2 == 1
				AddScriptPackage wlwQuestCarawanFollowSlot2
			Else
				AddScriptPackage wlwQuestCarawanFollowSlot1
			EndIf
			Set WaitState To 0
			Evp
		EndIf

		; Doktoren
		If GetInFaction DoctorsDialogueFaction == 1
			; Heilung
			If ( GetAv variable01 == 1 )
				If ( DocServiceOnce== 0 )
					DisablePlayerControls
					Evp
					SayTo player MegDocChurchMedicalChatter
					PlayIdle LooseDoctorHeal
					Set DocTimer to 8
					Set DocServiceOnce to 1
				EndIf
				Set DocTimer to ( DocTimer - GetSecondsPassed )
				If ( DocTimer <= 6 ) && ( DocServiceOnce == 1 )
					IMod FadeToBlackISFX
					SetStage Doctors 10
					EnablePlayerControls
					SetAv variable01 0
					Set DocServiceOnce to 2
				EndIf
			EndIf
			; Entseuchung
			If ( GetAv variable01 == 2 )
				If ( DocServiceOnce== 0 )
					DisablePlayerControls
					Evp
					PlayIdle LooseDoctorHeal
					Set DocTimer to 8
					Set DocServiceOnce to 1
				EndIf
				Set DocTimer to ( DocTimer - GetSecondsPassed )
				If ( IsAnimPlaying == 0 )
					PlayIdle LooseDoctorHeal
				EndIf
				If ( DocTimer <= 6 ) && ( DocServiceOnce == 1 )
					IMod FadeToBlackISFX
					SetStage Doctors 20
					EnablePlayerControls
					SetAv variable01 0
					Set DocServiceOnce to 2
				EndIf
			EndIf
			; Service beenden
			If DocServiceOnce > 0
				If GetAv variable01 == 0
					Set DocServiceOnce to 0
				EndIf
			EndIf
		EndIf
		
		If SpawnInterval < 0
			If GetDistance Player > 12000 || wlwQuestCarawan.CarawanLocked == 1 || wlwQuestCarawan.CarawanEnabled == 0 || wlwQuestCarawan.CurrentEnabled == 0
				Set SpawnState To 4
				Set wlwQuestCarawan.CurrentEnabled To 0
				Set wlwQuestCarawan.SpawnState To 0
				wlwQuestCarawanCurrentRef.Disable
				If wlwQuestCarawan.DebugCarawan == 1
					PlaySound AMBElevatorBell
					ShowMessage wlwQuestCarawanEndInfo
				EndIf
				MoveTo wlwQuestAmbushNullMarkerRef
				RemoveScriptPackage wlwQuestCarawanFollowSlot1
				AddScriptPackage wlwQuestCarawanWait
				Disable
			EndIf
			Set SpawnInterval To 2000
		Else
			Set SpawnInterval To SpawnInterval - 1
		EndIf
		
	EndIf

	If GetTimeDead > 12
		Disable
	EndIf	

End

; Map-Marker anzeigen
Begin MenuMode 1
	If SpawnState == 3
		wlwQuestCarawanCurrentRef.Enable
		wlwQuestCarawanCurrentRef.MoveTo CarawanRef
	EndIf
End

; Auf Tod reagieren, Gruppen nachfuehren
Begin OnDeath
	Set wlwQuestCarawan.CarawanDeadCount To wlwQuestCarawan.CarawanDeadCount + 1
	Set wlwQuestCarawan.LeaderDied To 1
	If IsKiller Player == 1
		RewardKarma -100
	EndIf
	Set SpawnState to 4
End