Fallout 3

Wenn Oblivion auf meinem Computer flüssig läuft, laufen dann auch Fallout 3 und New Vegas flüssig ? Hab gehört die 3 solln die gleiche Engine haben ... ^^
 
Siehe mein Sytem. Läuft locker.
Allerdings kannst du mit ENB und TXT Packs auch F3 und Vegas zum Stocken bringen. Finde jedoch das Oblivion mehr Power benötigt als die anderen beiden. Ist schwer zu sagen. Hab Oblivion so hoch gepowert mit OBGE und allem was es so gibt. Da kommt Fallout noch nicht ran- aber der neue ENB hat ja zumindestens auch schon SSAO und Sunglares.
 
Gibt es irgendetwas Neues zu WastelandWarriror?
Die Frage habe ich wohl verpasst, sorry. Bin immer noch zwischendurch am Werkeln und nächstens sollte eine neue Version WastelandWarrior kommen.
Habe vor allem noch die neuen Karawanen verbessert, die ab und zu buggy waren.
Gebe es allerdings zu, dass der Wille zum Testen gering ist, die Kämpfe machen mir kaum noch Spass, sodass ich zum Abkürzen mit meinem Entwickler-Blaster ballere. Und die Karawanen sind zeitaufwendig zum Testen, da muss man Stunden lang durchs Spiel und ist anschliessend immer noch nicht sicher, ob alles einwandfrei klappt.
 
Zuletzt bearbeitet:
Ich weiss zwar nicht was er da testet, doch meiner Erfahrung nach ist hier ne Menge Zeit zu vergeuden. Daher mein Tipp:

Das schwierige am Testen ist, dass die Packages und das KI Verhalten sehr viel Zufall mitbringen. Somit kann man nie genau sagen obs nun funktioniert oder nicht.
Das sorgt zwar für viel Abwechslung im Spiel. Behindert aber ungemein in der Testphase.

Eventuel schreibst du die Packages einfach mal zum Testen mit konstantem Verlauf. Und teste die Karavanen am Besten in einem Testwordspace. Zugegeben den muss man erst entwerfen. Doch es lohnt sich später. Habe ich auch immer vor mir hergeschoben.

So kannst du auch die Gegner genau bestimmen und deren Verhalten schnell beobachten.
Dann einfach das Package etwas abändern und schauen obs noch geht.

In der Regel geht das ganz gut und läuft dann auch im Spiel.
 
Grundsätzlich liegt es dran, dass mir vor allem das Gekloppe unglaublich schnarchnasig und technisch rückständig vorkommt, jedes Mal wenn ich wieder einsteige, nachdem ich zwischendurch etwa Borderlands 2 gezockt habe. Und das Spiel selbst bietet mir keinerlei Geheimnisse und Überraschungen mehr, da ich es seit Jahren zocke. Ich selbst habe zwar darauf geachtet, dass man Überraschungen erleben kann, aber für mich sind sind sie es natürlich nicht. Dabei sieht das Game unglaulbich gut aus und ich habe das Gefühl, auch sonst alles rausgeholt zu haben, was geht. Ich meine der nächste Step wäre, dass ich beginne Quests in einem neuen Worldspace zu machen und mir dazu professionelle Sprecher zu holen ;)

Die Karawanen gehören dazu, von denen eine von 8 hinter dem Spieler gespawnt werden und die er dann unendlich lange zu 10 zufälligen Zielen begleiten kann. Sind sie an einem Ziel angekommen, warten sie Minuten lang in der Sandbox und suchen sich dann ein neues.
Dahinter steckt eine recht komplexe Technologie, eigentlich ist nur der Führer Unique und persistent, alle anderen werden vier Slots, unsichtbaren Hunden angehängt, damit ich kontrollieren kann, wie die Karawane geordnet ist, dass z.B. die Herden am Schluss laufen, Reeisende in der Mitte und der Führer vorne. Und wenn sie unterwegs sind, fühlen sie sich unglaublich gut an, dieser Teil funktioniert und zeigt, was mit dieser unterschätzten Engine alles möglich ist.

Dann gibt es aber auch Probleme mit der Engine. Wenn die Actors der Karawane über einen bestimmten Radius zum Player gehen, der zwischen 10'000 bis 14'000 Einheiten(ungefähr die Distanz zwischen Tennpenny und Robco) liegt, stoppt deren Script-Verarbeitung. Sie können sich nicht selbst auflösen und damit die nächste Karawane starten. Und dieser Radius scheint eben zu schwanken, möglicherweise nach der aktuellen Performance.
Ich muss also den Radius zur Auflösung der Karawane aus Sicherheitsgründen auf 9'500 Einheiten stellen, was nicht unbedingt viel ist bei einer grossen Karawane. Es kann dann mal passieren, dass der Player der Gruppe am Schluss der Karawane hilft und sie plötzlich aufgelöst wird.
Dann musste ich auch noch behandeln, was passiert, wenn der Player wartet oder schläft. Die Engine beamt dann Actors mit einem Ziel näher dahin und das ist dann ebenfalls ausserhalb des Radius, indem Scripte verarbeitet werden können. Das Problem scheine ich jetzt gelöst zu haben, da beim Starten des Wartens der Zielmarker zum Player verschoben wird, sodass sie sich um diesen sammeln.
Jetzt weiss ich noch nicht, was ich bei Schnellreisen tue. Ich glaube, dass die Abfrage, ob der Player schnell gereist ist, erst funktioniert, wenn der Player bereits weg ist. Bin nicht sicher, ob ich das Schnellreisen verbiete, wenn sich der Player bei einer Karawane befindet. Da bin ich gerade dran, im Prinzip ist das noch mein einziges Problem, eigentlich dreht sich alles um diesen Radius, der beinflusst, ob sich eine Karawane neu bilden kann. Und das zu beobachten, ist relativ zeitaufwendig.

Edit:
Die Scripte hören übrigens auch auf zu funktionieren wenn der Player in einen Interior geht, während die Ziel-Packages weiter ausgeführt werden. Das ist kein Problem, wenn sich die Karawane nicht inzwischen mehr als 10'000 Einheiten bewegt hat aber sonst wird die Karawane wahrscheinlich auch nicht geordnet aufgelöst. Das Problem versuche ich auch gerade zu behandeln, indem ich die KI von Slot 1 deaktiviere, damit er sich nicht weiter bewegen kann.
 
Zuletzt bearbeitet:
Das Schnellreisen zu unterbieten ist doch eine gute Lösung. Ich habs bei mir so gemacht, das Schnellreisen nur an den Eingängen und Ausgängen von Städten möglich sind. Darüberhiaus wenn man am UBahn - Ein oder Ausgang ist.

Das mit dem Radius ist ja interessant. So etwas wusste ich nicht. Dachte das die Packages gestoppt werden, sobad der Player im Interior ist und auch der Cellenspace von 9X9 Distrikten (je nach dem was in der Ini steht) verlassen wird. Bist du dir sicher das die darüberhinaus weiter arbeiten? Es geht ja thoretisch auch nicht, da die Landschaft ab da durch das Lod ersetzt wird und dieses ist ja viel ungenauer. Da würden die NPCs ja nicht mehr Ihr Nav finden. Ob das Nav über die 9x9 hinaus geht weiss ich nicht, da es Ingame bei mir nicht anschaubar ist. Der Befehl dafür führt bei mir zum Absturz der Engine. Kann aber auch sein, dass ich mich irre. So habe ich das mit TFC jedenfalls alles beobachtet. Auch die KI und Animationen sind ab verlassen der 9x9 nicht mehr korrekt. Eventuell ist das ja auch der Radius von dem du da sprichst.


Aber was anderes: Das Project mit dem Riesenroboter
klappt zwar visuell, jedoch nicht aktiv. Ab Größe 5 ist Schluss mit ordentlichem KIverhalten. Ich weiss nicht was genau passiert. Jedoch habe ich den Eindruck als wenn der Robot nicht weiss wo der Gegner ist und somit keine Schüsse erfolgen, obwohl die Waffenanimation gespielt wird. Sehr seltsam. Auch die Collosionsabfrage ist nicht korrekt. Man kann ab dieser Größe duch den Roboter hindurchgehen. Auch die Trampelgeräusche fehlen. Jemand eine Idee?

Und noch etwas Anderes.
Kann es sein, das das geniale Feature mit den Soundtemplates
für Armors in Vegas garnicht funktioniert? Sobald das Flag Powerarmor gesetzt wird, werden die Powerarmorsounds gespielt und zwar die, die aus Fallout3 kommen und bei NV garnicht dabei sind. Ich habe die zwar dort eingefügt, denn ohne hört man nur die normalen Tritte. Doch ohne Template hat man die Powergeräusche ebenfalls. Wird das Powerflag abgeschaltet, dann läuft die Powerrüstung mit normalen Fussgeräuschen. Das entspricht genau dem Verhalten wie in der Vorgänger Fallout3 Engine.
Es kommt mir so vor, als wenn es völlig egal ist welches Template in den Armors steht. Die werden überhaupt nicht genutzt.

Jemand andere Beobachtungen gemacht? Oja ist bekannt. Wiedereinmal haben die Entwickler komplett versagt.
http://forums.nexusmods.com/index.php?/topic/264850-geck-and-audiotemplates/
 
Zuletzt bearbeitet:
Ausserhalb dem Grid werden Dinge deaktiviert, die nicht unbedingt notwenig sind, z.B. Animationen, aber auch Actor-Scripte. Wenn man z.B. Kühe mit einem Scope beobachtet, stehen die mit der Zeit schief in der Landschaft.
Aber wenn Actors ein Ziel haben, wird das auch vefolgt, wenn der Player nicht in der Nähe ist. Die laufen dann wahrscheinlich nicht wirklich, sondern werden über die Zeit näher zum Ziel gebeamt. Ich habe ja auch einen Perk, der Karawanenpositionen sichtbar auf der Map macht und die bewegen sich. Das Navmesh sind ja nur Koordinaten und wahrscheinlich nimmt das Spiel an, dass Punkte darauf sicher sind.
Übrigens ist das mit den Actor-Scripten auch der Grund, wieso ich Spawn-Clean für ein Plazebo halte. Da Scripte nur um die 10'000 Einheiten lang funktionieren, müsste man die Actors extrem schnell deaktivieren, damit das einen Sinn macht. Nach meiner Erinnerung können z.B. die Spawn-Cleans in Venom gar nicht funktionieren,

Ich habe auch riesige Viecher und die scheinen problemlos zu funktionieren. Kommen die Trampelgeräusche, wenn du den Robot wieder kleiner machst?
 
  • Like
Reaktionen: robinH
Soweit bin ich leider noch nicht. Bin erstmal froh, das jetzt der Player wenigstens die Powerarmor Tritte hat. Ich meine aber da nichts gehört zu haben. Dagegen hört man bei anderen Riesen Creaturen deren Tritte. Das scheint nur mit der von mir genutzten Powerarmor nicht zu klappen. Werde noch einmal andere Powerarmors testen Die Geräuschfunktion funktioniert bei den Creaturen jeodch völlig anders. In Oblivion hatte ich bemerkt, das es etwas mit dem Mesh zu tun haben könnte. Manche Creaturen aus Modresourcen hatten auch keine Trittgeräusche. Die Powerarmor da stammt ja auch aus einer Modresource.

Tja das habe ich auch beobachtet, das die NPC dann nur über den Boden schweben bzw. Die Creaturen mit dem Kopf im Boden versinken und ohne Animation sich nur noch nach vorne schieben. Das Dumme ist, ich weiss nie was durch Fehler der Kombi Fallout3 mit Veags hervorgerufen wird. Gut das du die selben Dinge beobachtet hast. Dachte schon das ist wieder irgendein Fehler.
Allerdings kann ich mich nicht erinnern, dass das bei F3 damals so war. Da lief keine Kreatur schräg über den Boden. Eventuell war mein PC aber auch zu schwach damals, so das ich nicht so weit sehen konnte.

Ich habe eine interessante Feststellung gemacht. Vieleicht hilft sie ja dem Einen oder Anderem.

Da mir die Messer zu wenig Schaden gemacht haben, habe ich den erhöht. Nun dachte ich, wenn dem Gegner mal die Munition ausgeht, würde ein Messer als Backupwaffe im Inventar recht nützlich sein. So weit so gut. Nun berechnet der PC aber, dass das Messer mehr Schaden verursacht als die SMG. Obwohl diese ja durch die Schussfeequenz mehr als 5 mal so wiel Schaden verursachen würde. Doch der PC sagt sich nun. Ich benutzte lieber das Messer.

FAZIT: Die Ferngegner stehen nur noch mit dem Messer im Anschlag da und warten bis der Player in in die Nähe kommt oder sie diesen angreifen können. Die SMG wird einfach nicht benutzt.

Allso habe ich jetzt dafür gesorgt, das es nicht Spielbare Messer (mit wenig Schaden) gibt, die nur dem Zweck dienen, dass der Gegner sie nutzt, sobald die Munition zu Neige geht. Sieht besser aus als wenn sie mit den Fäusten im Anschalg darstehen. Sollte das mal der Fall sein, da ich ebenfalls eine nicht spielbare Munitionsart je Waffe erstellt habe und die in zufälliger Höhe in Fülle in den WithAmmo Listen der Waffen und den Ammo-Loodlisten liegt.

FAZIT: Nun ist der Gegner aber so was von dabei die Waffen zu nutzen. Geht Ihm die Munition aus, nimmt er welche von seinem toten Partner oder er holt sie sich aus einem Contaiener in der Nähe. Also das ist mal Spielspass, wie er von Anfang an hätte sein sollen.
So findet der Player trotz allem wenig Munition und die Gegner haben immer genug zur Hand. Der Selbstbau von Munition steht somit sehr im Fordergrund.

EDIT: Per Sript muss die muni beim Aufnehmen der Waffe allerdings noch entfernt werden. Denn die NPC ammo steckt auch in der Waffe und wird trotz das sie nicht Spielbar ist, dann spielbar.

Mal was anderes. Was ist mit der Funktion mehrere Gegner an einem Levelcreaturpunkt zu spawnen. Wenn ich dort zb eine 3 einsetze, kommt trotzdem nur Einer. Auch der Weg im Levelcreaturpunkt 3 Creaturen direkt einzusetzten führt zum selben Ergebnis. In Oblivion würden 3 kommen.
Mache ich da was Falsch?
 
Zuletzt bearbeitet:
Was meinst du genau. Ich wollte das manuell lösen. Es lässt sich doch im CS dort die Anzahl der Spawns eigeben. So wie halt in Oblivion auch.
Doch wie gesagt es tut sich nichts. Benötigt es dazu ein neues Game? Das wäre übel. Möchte nicht schon wieder Neu anfangen.

By the Way. Das löschen des gesammten Savegameordners führt dazu, dass die Saves wieder bei 0 beginnen. Ist ganz Einfach. Auch lassen sich beliebige Saves im Ordner kombinieren. So kann jeder seine Saves jederzeit sortieren und bei Bedarf wieder einfügen.

Doch zurück:
Ausserdem hatte ich vor die Listen wärend des Spiels nach und nach anzupassen. Es kann doch nicht sein, das das vorher berechnet wird. Ich dachte immer der Spawn wird erst dann erzeugt, wenn die Celle betreten wird. Sprich diese auch geladen wird. So läuft es doch auch mit den Containern und Itemlisten.
 
Du kannst so nirgends direkt im GECK die Anzahl der Spawns pro Actor eingeben. Es hat keine Auswirkungen, wenn du in der Liste der gelevelten Actors die Zahl erhöhst.
Du musst entweder manuell mehr gelevelte Actors in einer Zelle platzieren oder ein Script auf die gelevelten Actors setzen, das mehr vom selben Typ mit PlaceAtMe spawnt. Ich mache das fast immer per Script.
Würde mal hier nachlesen:
http://geck.bethsoft.com/index.php?title=LeveledCharacter
 
  • Like
Reaktionen: robinH
Aha, da wurde also eine geniale Funktion aus Oblivion einfach mal weggelassen. Ich fasse es nicht. Na ok seis drum. Doch wie sieht denn nun so ein Spawnscript aus? Hast du mal ein Beispiel.

Übrigens der Robo läuft nun. Doch die Geräusche hören ab einer bestimmten Größe offensichtilich auf. Welche das ist, weiss ich aber noch nicht.
 
Ich persönlich finde es überhaupt nicht sinnvoll, Actors mit dem GECK in der Welt zu platzieren. Selbst wenn ich eine komplette Kampfgruppe spawnen möchte, mache ich das mit einem Activator.
Es gibt mehrere Methoden, um Actors per Script zu spawnen.

1. Man kann z.B. ein Actor-Script auf beliebige Actors setzen, die dann mehr von ihnen spawnen.
2. Alternativ würde es auch über einen gescripteten Actor-Effekt gehen.
3. Man kann ein Script auf einen Aktivator setzen, den man von Hand platziert.

Das hier ist mein generelles Aktivatoren-Script. Es braucht nur ein Script für alle Typen von Spawn, weil es ermitteln kann, wie der Aktivator heisst, den es betrifft. Im Prinizp kann man einen neuen Aktivator mit einem sinnvollen Namen erstellen und ihm das sScript anhängen. Anschliessend erweitert man es um den notwendigen Spawn. Im Script kann ein Aktivator bis zu vier verschiedene Typen spawnen und ich kann verschiedene vorgefertigte Zufallszahlen verwenden.
Ausserdem spawnt das Script nur, wennes nicht zuviele geladene Referenzen in der Memory hat. Zudem reagiert es auf Tag/Nacht und ob man gerade in Lookout ist.
Die gespawnten Actors sind gelevelt, haben als Template also eine Auswahl von Gegnern mit verscheidenen Leveln.

scn wlwActivatorSpawnScript
Code:
ref GroupRef1			; Gruppen-Referenz
ref GroupRef2			; Gruppen-Referenz
ref GroupRef3			; Gruppen-Referenz
ref GroupRef4			; Gruppen-Referenz
short GroupOut1		; Gruppen-Anzahl
short GroupOut2		; Gruppen-Anzahl
short GroupOut3		; Gruppen-Anzahl
short GroupOut4		; Gruppen-Anzahl
short Random			; Zufall
short Random1or2	; 1 oder 2
short Random1			; 1-3
short Random2			; 3-5
short Random3			; 5-7
short SpawnState		; Spawn-Status
short SpawnRate		; Rate
short PlayerLevel		; Level-Begrenzung Spawn
short IsNight			; Tag-Nacht
short IsLookout		; Region Lookout 0, 1
short SpawnTimer		; Interval-Steuerung
short SpawnCount		; Anzahl geladene Gegner
float PlayerDistance	; Abstand zum Player
short SpawnCap		; Obergrenze Spawn
short TimeStamp		; Reseten
short DisableMe		; Deaktivieren

Begin OnLoad
	If wlwQuestSpawn.SpawnLocked == 0 && wlwQuest.EnemyRate > 0 && (SpawnState == 0 || GameDaysPassed > TimeStamp)
		Set SpawnState To 1
		Set SpawnTimer To 100
		Set TimeStamp To GameDaysPassed + wlwQuest.CellRespawnDays
		Set SpawnCap To wlwQuestSpawn.SpawnCap
	EndIf
End

Begin GameMode

	; Ueberwachung
	If SpawnState == 1 && GetDisabled == 0
		If SpawnTimer < 0
			Set SpawnCount To GetActorsInHigh
			Set PlayerDistance To GetDistance Player
			If PlayerDistance > 500 && PlayerDistance < 10000 && SpawnCount < SpawnCap
				Set SpawnState To 2
			Else
				If wlwDebugMode == 1
					ShowMessage wlwInfoSpawnActivatorFailed PlayerDistance SpawnCount SpawnCap
				EndIf
			EndIf
			Set SpawnTimer To 1400
		Else
			Set SpawnTimer To SpawnTimer - 1
		EndIf
	EndIf	
	
	; Gruppe waehlen
	If SpawnState == 2
		; Start-Werte
		Set IsLookout To wlwQuestGeneric.IsRegionLookout
		Set PlayerLevel To Player.GetLevel
		If GetCurrentTime < 4 || GetCurrentTime > 22
			Set IsNight To 1
		Else
			Set IsNight To 0
		EndIf
		; Gegner-Anzahlen ermitteln
		Set SpawnRate To wlwQuest.EnemyRate
		Set Random1 To 2 + (GetRandomPercent / 30)
		If Random1 > SpawnRate
			Set Random1 To SpawnRate
		EndIf
		Set Random2 To SpawnRate + (GetRandomPercent / 20)
		If Random2 > (SpawnRate * 2)
			Set Random2 To (SpawnRate * 2)
		EndIf
		Set Random3 To SpawnRate + (GetRandomPercent / 10)
		If Random3 > (SpawnRate * 3)
			Set Random3 To (SpawnRate * 3)
		EndIf
		Set Random1or2 To 1
		If GetRandomPercent > 50
			Set Random1or2 To 2
		EndIf
		Set GroupRef1 To CrRadRoach
		Set GroupOut1 To 0
		Set GroupRef2 To CrRadRoach
		Set GroupOut2 To 0
		Set GroupRef3 To CrRadRoach
		Set GroupOut3 To 0
		Set GroupRef4 To CrRadRoach
		Set GroupOut4 To 0
		; Gruppen
		If GetIsId wlwActivatorAnimalToughMore
			Set GroupRef1 To wlwSpawnAnimalTough
			Set GroupOut1 To Random1	
		ElseIf GetIsId wlwActivatorAntFireMore
			Set GroupRef1 To wlwSpawnAntFire
			Set GroupOut1 To Random1	
		ElseIf GetIsId wlwActivatorDeathClawQueenOne
			Set GroupRef1 To wlwDeathClawQueen
			Set GroupOut1 To 1
			Set GroupRef2 To wlwSpawnDeathClaw
			Set GroupOut2 To 1 + Random1or2 
			Set GroupRef3 To wlwDeathClawWarrior
			Set GroupOut3 To Random1or2 	
		ElseIf GetIsId wlwActivatorRadRoachMotherOne
			Set GroupRef1 To wlwRadroachMother
			Set GroupOut1 To 1
		ElseIf GetIsId wlwActivatorRadRoachPest
			Set GroupRef1 To wlwRadroachWarrior
			Set GroupOut1 To Random1
			Set GroupRef2 To CrRadroach
			Set GroupOut2 To Random2	
		ElseIf GetIsId wlwActivatorScorpionMore
			Set GroupRef1 To wlwSpawnScorpion
			Set GroupOut1 To Random1	
		ElseIf GetIsId wlwActivatorSpiderMineMore
			Set GroupRef1 To wlwSpiderMine 
			Set GroupOut1 To Random2	
		ElseIf GetIsId wlwActivatorYaoGuaiMore
			Set GroupRef1 To wlwYaoGuaiMother
			Set GroupOut1 To 1
			Set GroupRef2 To wlwSpawnYaoGuai
			Set GroupOut2 To Random1	
		ElseIf GetIsId wlwActivatorMireLurkMore
			If GetInCell NukaColaPlant01 || GetInCell NukaColaPlant02 || GetInCell NukaColaPlant03
				Set GroupRef1 To wlwNukaLurkQueen
				Set GroupOut1 To 1
			ElseIf IsLookout == 1
				Set GroupRef1 To wlwSpawnSwampLurk
				Set GroupOut1 To Random1
			Else
				Set GroupRef1 To wlwSpawnMirelurk
				Set GroupOut1 To Random1
			EndIf
		ElseIf GetIsId wlwActivatorGhoulRandomMore
			If IsLookout == 0
				If IsNight == 0
					Set GroupRef1 To wlwSpawnGhoulRandom
					Set GroupOut1 To Random1
				Else
					Set GroupRef1 To wlwSpawnGhoulNight
					Set GroupOut1 To Random1			
				EndIf
			Else
				Set GroupRef1 To wlwSpawnGhoulSwamp
				Set GroupOut1 To Random1
			EndIf	
		ElseIf GetIsId wlwActivatorGeorgeWBush
			Set GroupRef1 To wlwUndeadGeorgeWBush
			Set GroupOut1 To 1
		ElseIf GetIsId wlwActivatorChineseGhoulMore
			Set GroupRef1 To wlwSpawnChineseGhoulSoldier
			Set GroupOut1 To Random1
		ElseIf GetIsId wlwActivatorMutantBigGunOne
			Set GroupRef1 To wlwSpawnMutantBigGun
			Set GroupOut1 To 1	
		ElseIf GetIsId wlwActivatorMutantGunOne
			Set GroupRef1 To wlwSpawnMutantGun
			Set GroupOut1 To 1	
		ElseIf GetIsId wlwActivatorMutantMeleeOne
			Set GroupRef1 To wlwSpawnMutantMelee
			Set GroupOut1 To 1	
		ElseIf GetIsId wlwActivatorMutantRandomMore
			Set GroupRef1 To wlwSpawnMutantRandom
			Set GroupOut1 To Random1
		ElseIf GetIsId wlwActivatorMutantRandomOne
			Set GroupRef1 To wlwSpawnMutantRandom
			Set GroupOut1 To 1	
		ElseIf GetIsId wlwActivatorOverlordRandomOne
			Set GroupRef1 To wlwSpawnMutantOverlord
			Set GroupOut1 To 1
		ElseIf GetIsId wlwActivatorBehemothAndMutants
			Set GroupRef1 To wlwSpawnMutantBehemoth
			Set GroupOut1 To 1
			Set GroupRef2 To wlwSpawnMutantRandom
			Set GroupOut2 To Random1
		ElseIf GetIsId wlwActivatorOverlordMonsterAndMutants
			Set GroupRef1 To wlwMutantOverlordMonster
			Set GroupOut1 To 1
			Set GroupRef2 To wlwSpawnMutantRandom
			Set GroupOut2 To Random1
		ElseIf GetIsId wlwActivatorTalonRandomMore
			Set GroupRef1 To wlwSpawnTalonRandom
			Set GroupOut1 To Random1
		ElseIf GetIsId wlwActivatorTalonFemaleRandomMore
			Set GroupRef1 To wlwSpawnTalonFemaleRandom
			Set GroupOut1 To Random1
		ElseIf GetIsId wlwActivatorTribalDeathClawFriendlyMore
			If wlwQuestSpawn.PointLookoutCathedralEnabled == 1 && wlwQuest.ModeLookout == 1
				Set GroupRef1 To wlwSpawnTribalUnarmedFriendly
				Set GroupOut1 To Random1 
				Set GroupRef2 To wlwSpawnDeathClawTribalFriendly
				Set GroupOut2 To Random1 
				Set GroupRef3 To wlwDeathClawTribalBaby
				Set GroupOut3 To Random1 
				Set GroupRef4 To wlwDeathClawTribalMother
				Set GroupOut4 To 1
			EndIf
		ElseIf GetIsId wlwActivatorTribalDog
			Set GroupRef1 To wlwSpawnDogTribalFriendly
			Set GroupOut1 To Random1or2 + 1
		ElseIf GetIsId wlwActivatorTribalGuards
			Set GroupRef1 To wlwSpawnTribalGuard
			Set GroupOut1 To 2
		ElseIf GetIsId wlwActivatorTribalDeathClawHostilMore
			Set GroupRef1 To wlwSpawnTribalUnarmed
			Set GroupOut1 To Random1
		ElseIf GetIsId wlwActivatorUndeadMore
			Set GroupRef1 To wlwSpawnUndead
			Set GroupOut1 To Random1	
		ElseIf GetIsId wlwActivatorUndeadOne
			Set GroupRef1 To wlwSpawnUndead
			Set GroupOut1 To 1
		ElseIf GetIsId wlwActivatorRaiderAmazoneMore
			Set GroupRef1 To wlwSpawnRaiderAmazone
			Set GroupOut1 To Random1
		ElseIf GetIsId wlwActivatorRaiderFlamerOne
			Set GroupRef1 To wlwSpawnRaiderFlamer
			Set GroupOut1 To 1
		ElseIf GetIsId wlwActivatorRaiderHeavyOne
			Set GroupRef1 To wlwSpawnRaiderHeavy
			Set GroupOut1 To 1	
		ElseIf GetIsId wlwActivatorRaiderPsychoOne
			Set GroupRef1 To wlwSpawnRaiderPsycho
			Set GroupOut1 To 1
		ElseIf GetIsId wlwActivatorRaiderSniperOne
			Set GroupRef1 To wlwSpawnRaiderSniper
			Set GroupOut1 To 1	
		ElseIf GetIsId wlwActivatorRaiderRandomMore
			Set GroupRef1 To wlwSpawnRaiderRandom
			Set GroupOut1 To Random1
		ElseIf GetIsId wlwActivatorBrotherhoodRandomMore
			Set GroupRef1 To wlwSpawnBrotherHood
			Set GroupOut1 To Random1
		ElseIf GetIsId wlwActivatorOutcastRandomMore
			Set GroupRef1 To wlwSpawnOutcast
			Set GroupOut1 To Random1
		ElseIf GetIsId wlwActivatorTalonHeavyOne
			Set GroupRef1 To wlwSpawnTalonSpecialist
			Set GroupOut1 To 1
		ElseIf GetIsId wlwActivatorRobotBoSOne
			Set GroupRef1 To wlwSpawnRobotBoS
			Set GroupOut1 To 1
		ElseIf GetIsId wlwActivatorRobotOutcastOne
			Set GroupRef1 To wlwSpawnRobotOutcast
			Set GroupOut1 To 1
		ElseIf GetIsId wlwActivatorRobotTalonOne
			Set GroupRef1 To wlwSpawnRobotTalon
			Set GroupOut1 To 1
		ElseIf GetIsId wlwActivatorDogTalonMore
			Set GroupRef1 To wlwSpawnDogTalon
			Set GroupOut1 To Random1or2 
		ElseIf GetIsId wlwActivatorDogRaiderMore
			Set GroupRef1 To wlwSpawnDogRaider
			Set GroupOut1 To Random1or2 
		ElseIf GetIsId wlwActivatorSwampLurkBogFamily
			Set GroupRef1 To wlwSwampLurkQueenBog
			Set GroupOut1 To 1 
			Set GroupRef2 To wlwSpawnSwampLurkBog
			Set GroupOut2 To Random1 
			Set GroupRef3 To wlwSpawnSwampLurkBog
			Set GroupOut3 To 2 
		ElseIf GetIsId wlwActivatorSwampLurkBogGuards
			Set GroupRef1 To wlwSpawnSwampLurkBog
			Set GroupOut1 To Random1or2 
		ElseIf GetIsId wlwActivatorPredatorFeed
			If IsLookout == 1
				If wlwQuestSpawn.PointLookoutCathedralEnabled == 1 && wlwQuest.ModeLookout == 1
					Set GroupRef1 To wlwMoleRatNearDead
					Set GroupOut1 To 1 + Random1or2 
				EndIf
			Else
				Set GroupRef1 To wlwMoleRatNearDead
				Set GroupOut1 To 1 + Random1or2 
			EndIf
		ElseIf GetIsId wlwActivatorReillySquad
			Set GroupRef1 To wlwSpawnReillySpecialist
			Set GroupOut1 To Random1or2  
			Set GroupRef2 To wlwSpawnReillyRandom
			Set GroupOut2 To Random1 
			Set GroupRef3 To wlwSpawnDogReilly
			Set GroupOut3 To 2 
		ElseIf GetIsId wlwActivatorReillySquadAfterQuest
			If GetStage MS18 >= 50
				Set GroupRef1 To wlwSpawnReillySpecialist
				Set GroupOut1 To Random1or2  
				Set GroupRef2 To wlwSpawnReillyCamp
				Set GroupOut2 To Random1 
				Set GroupRef3 To wlwSpawnDogReilly
				Set GroupOut3 To 2 
			EndIf
		;  Spezieller Spawn Seward Square, Aktvator wird durch Vanilla enabled
		ElseIf GetIsId wlwActivatorEnclaveSquad
			Set GroupRef1 To wlwSpawnEnclaveSpecialist
			Set GroupOut1 To 1  
			Set GroupRef2 To wlwSpawnEnclave
			Set GroupOut2 To Random1or2
			Set GroupRef3 To wlwSpawnRobotEnclave
			Set GroupOut3 To 1
		Else
			If wlwDebugMode == 1
				ShowMessage wlwInfoSpawnActivatorTypeFailed
			EndIf
		EndIf
		Set SpawnState To 3
	EndIf
	
	; Gruppe spawnen
	If SpawnState == 3
		If GroupOut1 > 0
			PlaceAtMe GroupRef1 GroupOut1
			Set GroupOut1 To 0
		EndIf
		If GroupOut2 > 0
			PlaceAtMe GroupRef2 GroupOut2
			Set GroupOut2 To 0
		EndIf	
		If GroupOut3 > 0
			PlaceAtMe GroupRef3 GroupOut3
			Set GroupOut3 To 0
		EndIf	
		If GroupOut4 > 0
			PlaceAtMe GroupRef4 GroupOut4
			Set GroupOut4 To 0
		EndIf	
		Set SpawnState To 4
		If DisableMe == 1
			Set DisableMe To 0
			Disable
		EndIf
	EndIf
	
End
 
  • Like
Reaktionen: robinH
Das ist echt eine geniale Methode, die du ada anwendest. Nur den Aktivator in die Welt setzen und fertig. Das Script habe ich soweit verstanden, Hab es mal auf das Minimum gekürzt, um Fragen dazu besser stellen zu können. Ein paar Syntaxbefehle sind mir nicht ganz klar.

ref GroupRef1 ; Gruppen-Referenz
ref GroupRef2 ; Gruppen-Referenz
ref GroupRef3 ; Gruppen-Referenz
ref GroupRef4 ; Gruppen-Referenz

short GroupOut1 ; Gruppen-Anzahl
short GroupOut2 ; Gruppen-Anzahl
short GroupOut3 ; Gruppen-Anzahl
short GroupOut4 ; Gruppen-Anzahl

short Random ; Zufall

short Random1or2 ; 1 oder 2
short Random1 ; 1-3
short Random2 ; 3-5
short Random3 ; 5-7
short SpawnState ; Spawn-Status

short SpawnRate ; Rate wird mit wlwQuest.EnemyRate ersetzt ???????

short PlayerLevel ; Level-Begrenzung Spawn

short SpawnCount ; Anzahl geladene Gegner wird gesetzt durch GetActorsInHigh ????????????
short SpawnCap ; Obergrenze Spawn ???????? damit der Count wohl nicht zu hoch wird
short SpawnTimer ; Interval-Steuerung

short TimeStamp ; Reseten
short DisableMe ; Deaktivieren


Begin OnLoad
If wlwQuestSpawn.SpawnLocked == 0 && wlwQuest.EnemyRate > 0 && (SpawnState == 0 || GameDaysPassed > TimeStamp)
Set SpawnState To 1
Set SpawnTimer To 100
Set TimeStamp To GameDaysPassed + wlwQuest.CellRespawnDays
Set SpawnCap To wlwQuestSpawn.SpawnCap
EndIf
End

Begin GameMode

; Ueberwachung
If SpawnState == 1 && GetDisabled == 0
If SpawnTimer < 0
Set SpawnCount To GetActorsInHigh

Set PlayerDistance To GetDistance Player

If PlayerDistance > 500 && PlayerDistance < 10000 && SpawnCount < SpawnCap
Set SpawnState To 2
Else
If wlwDebugMode == 1
ShowMessage wlwInfoSpawnActivatorFailed PlayerDistance SpawnCount SpawnCap
EndIf
EndIf
Set SpawnTimer To 1400
Else
Set SpawnTimer To SpawnTimer - 1
EndIf
EndIf

; Gruppe waehlen
If SpawnState == 2

;==============Start-Werte=======================================
Set PlayerLevel To Player.GetLevel

;============Nachtstatus setzen =================================
If GetCurrentTime < 4 || GetCurrentTime > 22
Set IsNight To 1
Else
Set IsNight To 0
EndIf

;========Gegner-Anzahlen ermitteln==============================
Set SpawnRate To wlwQuest.EnemyRate

Set Random1 To 2 + (GetRandomPercent / 30)
If Random1 > SpawnRate
Set Random1 To SpawnRate
EndIf

Set Random2 To SpawnRate + (GetRandomPercent / 20)
If Random2 > (SpawnRate * 2)
Set Random2 To (SpawnRate * 2)
EndIf

Set Random3 To SpawnRate + (GetRandomPercent / 10)
If Random3 > (SpawnRate * 3)
Set Random3 To (SpawnRate * 3)
EndIf

Set Random1or2 To 1
If GetRandomPercent > 50
Set Random1or2 To 2
EndIf

;==Wozu es reicht doch wenn die Outs alle auf Null stehen==
Set GroupRef1 To CrRadRoach
Set GroupOut1 To 0
Set GroupRef2 To CrRadRoach
Set GroupOut2 To 0
Set GroupRef3 To CrRadRoach
Set GroupOut3 To 0
Set GroupRef4 To CrRadRoach
Set GroupOut4 To 0

;===============Gruppen erstellen===============================
If GetIsId wlwActivatorDeathClawQueenOne
Set GroupRef1 To wlwDeathClawQueen
Set GroupOut1 To 1

Set GroupRef2 To wlwSpawnDeathClaw
Set GroupOut2 To 1 + Random1or2

Set GroupRef3 To wlwDeathClawWarrior
Set GroupOut3 To Random1or2

ElseIf GetIsId wlwActivatorGhoulRandomMore
If IsNight == 0
Set GroupRef1 To wlwSpawnGhoulRandom
Set GroupOut1 To Random1
Else
Set GroupRef1 To wlwSpawnGhoulNight
Set GroupOut1 To Random1
EndIf

Else
If wlwDebugMode == 1
ShowMessage wlwInfoSpawnActivatorTypeFailed
EndIf
EndIf

Set SpawnState To 3
EndIf

;=================Gruppe spawnen====================================
If SpawnState == 3
If GroupOut1 > 0
PlaceAtMe GroupRef1 GroupOut1
Set GroupOut1 To 0
EndIf
If GroupOut2 > 0
PlaceAtMe GroupRef2 GroupOut2
Set GroupOut2 To 0
EndIf
If GroupOut3 > 0
PlaceAtMe GroupRef3 GroupOut3
Set GroupOut3 To 0
EndIf
If GroupOut4 > 0
PlaceAtMe GroupRef4 GroupOut4
Set GroupOut4 To 0
EndIf

Set SpawnState To 4

If DisableMe == 1
Disable
Set DisableMe To 0
EndIf

EndIf

End

Was machst du hier genau?
Set SpawnCount To GetActorsInHigh

Wer oder was setzt ?
GetDisabled == 0
DisableMe == 1

Dann gibt es da noch die Spawnrate und die Enemyrate

Welche, Zweck dienen die, bzw, welche Werte können die haben?
 
Zuletzt bearbeitet:
GetActorsInHigh ist eine Game-Funktion, die zurück gibt, wieviele Gegner aktuell in der Memory vollständig geladen sind und das sind die, die die Performance belasten.

Das SpawnCap ist eine Variable, die man bei mir im Menu verstellen kann, genau so wie SpawnRate. Beide sind Variablen von wlwQuestSpawn als zentraler Sammelpunkt aller Spawn-Variablen. SpawnCap ist bei mir auf 50, aber auch 100 würden laufen, wenn man eine gute Kiste hat. Wobei das nur eine grobe Variable ist, um zu starke Slowdowns zu verhindern, so können bei GetActorsinHigh 49 und SpawnCap 50 nochmals 10 gespawnt werden.
Man kann im Prinzip eine hohe Spawnrate und ein normales Cap haben, so werden möglicherweise zuerst viele Raider, aber dann weniger Ratten gespawnt, je nachdem welchem Aktivator man sich zuerst nähert. Bei einer niederen Spawnrate und normalem Cap ist möglicherweise der Spawn abwechslungsreicher, da verschiedene Gruppen jeweils nur wenige spawnen.

GetDisabled fragt ab, ob der aktuelle Aktivator disabled ist. Manche Aktivatoren sollen nur ein Mal spawnen oder sollen erst duch eine Quest oder sonst was aktiviert werden. Z.B. werden bei mir mehr Reilly Rangers gespawnt, wenn man deren Quest erfüllt hat.

DisableMe ist eine eigene Variable, die ganz am Schluss den Aktivator disabled, nachdem die Funktionen ausgeführt wurden. In einem Fall wird ein Aktivator sogar von Vanilla enabled, der im GECK als Initially disabled bezeichnet ist. Wenn du auf einen solchen Aktivator von aussen per Script zugreifen möchtest, muss der eine persistente Referenz sein und eine eindeutige ID haben, was du einstellen kannst, nachdem du einen Aktivator in die Welt platzierst hast.

Es gibt übrigens noch eine Methode neben GetIsId. Damit wird die Basis-ID abgefragt, z.B. wlwActivatorMutantRandomMore. Es ist aber auch möglich GetIsReference abzufragen, wenn du z.B. einen in der Welt platzierten persistenten Aktivator auslesen möchtest, z.B. wlwActivatorMutantsRandomMoreRef13. Du kannst so einen generischen Aktivator haben, der normalerweise 10 Gegner spawnt. Aber an einem bestimmten Ort machst du den selben Aktivator zu einer persistenten Referenz mit ID und könntest da z.B. weniger spawnen.

Stimmt, es würde reichen, die GroupOutX auf Null zu lassen.

Beim SpawnTimer als Contdown/Interval-Steuerung verwende ich nicht wie die meisten GetSecondsPassed um die verstrichene Zeit zu ermitteln, da GetSecondsPassed eine Funktion ist, die ermitteln muss, wieviele Sekunden seit der letzten Script-Verarbeitung vergangen sind. Es können problemlos 200 Intervalle gleichzeitig am Laufen sein und vielleicht bringt das noch eine geringe Erleichterung für die Engine. Ich nehme an, dass der Wert 0.015 Sekunden ist, also sind 1400 Durchläufe gute 20 Sekunden. Und diesen Intervall mache ich,weil "GetDistance Player" Performance saugt, wenn man es nicht bremst.

Bei den meisten Spawn-Scripten da draussen wird zwingend bei OnLoad gespawnt. OnLoad passiert aber in einer relativ grossen Distanz, sodass es durchaus viele Gegner haben kann, die der Player niemals sieht. Und die werden gespawnt, egal ob es bereits ruckelt. Mein Script ermittelt also alle 20 Sekunden, ob ein Aktivator eine vernünftige Distanz zum Player hat und ob es nicht zuviele Actors in der Szene hat. Wenn man ausreichend Gegner massakriert hat, kann es also passieren, dass wieder neue kommen.

wlwQuest.CellRespawnDays
ist ebenfalls eine externe Variable, da man bei mir den Zell-Respawn per Script im Menu einstellen kann. So wird gewährleistet, dass die Aktivatoren nicht zu früh erneut spawnen können,wenn die alten Gegner noch nicht aufgeräumt sind.

Edit
Der Screenshot zeigt übrigens mein Aktivatoren-System, das ich intern als Grid bezeichne. Wenn man nämlich GetActorsInHigh verwendet, muss man keine Rücksichten nehmen und weniger Aktivatoren platzieren.
Die roten Klötze sind nur Tiere, die blauen können alles spawnen, bis zum kompletten Squad.
Die kleinen weissen, grünen und roten Punkte sind Vanilla-Gegner, die aber ebenfalls ein Spawn-Script von mir angehängt haben.
Ausserdem können auch die Vanilla-Encounter-Trigger spawnen und in Point Lookout alle Punga-Pflanzen. Es gibt leider im Ödland nichts, das bereits so schön flächendeckend wie die Pungas in der Welt platziert ist, sonst hätte ich auf die zusätzlichen Aktivatoren verzichtet.
 

Anhänge

  • Fallout3-233.jpg
    Fallout3-233.jpg
    121,8 KB · Aufrufe: 149
Zuletzt bearbeitet:
  • Like
Reaktionen: robinH
Oh das ist interessant, also braucht es im Grunde keine neuen Aktivatoren, sondern vorhandene können genutzt werden um dort ein Spawn zu ermöglichen. Richtig?

Das wäre ja zu schön um wahr zu sein. Welche Aktivatoren lassen sich denn dafür nutzen. Alle? Es sind mir in den Metros immer viel zu wenig von den Ghulen. Die hätte ich gerne verdreifacht. Und an manchen Dunklen Stellen (Die Sackgassen bieten sich ja gerade zu an) würde ich am liebsten sogar richtige Ghoulnester haben. So wie in I am Legend. Währe ja nur logisch.

Dann würde eine SMG mal richtig zum Einsatz kommen. Die paar Ghoule da im Original sind ja nicht gerade herausfordernd. Auch die Raidertrupps sind immer zu wenig. Zwar nutzen die jetzt ausgiebig Ihre Waffen. Doch zum Kreuzfeuer kommt es meist nicht, da es zu wenig sind. Einen davon schaltet man ja meist recht schnell aus. Das Doppelte wäre da genau richtig.

Bin mal zum Test mit Cherrico und seiner chinesischen SMG unterwegs gewesen. Die haben da keine Chance. Der ballert da (jetzt wo Ihm die Munition nicht mehr ausgeht) was das Zeug hält. Wären es aber mehr von diesen Raidern, so bräuchte er Unterstützung. Das zeigt auch die Verteidigung Goodsprings, da war Cherrico Alleine nicht so efolgreich. Zwar nutzt er die SMG ausgiebig. Doch da es recht viele Gegner sind, bleibt da der eine oder andere Bewohner schnell auf der Strecke. Ohne die Nutzung einer Granate oder Dynamit überleben Sunny und die Frau aus der Kneipe die Mission meist nicht.

Mal schauen, welche schon in der Welt plazierten Aktivatoren sich da am besten eignen.
 
An sich kann man alles zum Spawnen missbrauchen, was ein Script tragen kann, sogar Lampen, Türen oder Parkuhren. Man kann ein neues Script bei bereits vorhandenen Aktivatoren anhängen oder sogar Scripte aus Vanilla erweitern, z.B. die Encounter-Trigger. Leider gibt es im Ödland nichts, das so hübsch verteilt ist, wie die Pungas.
Man muss allerdings aufpassen, was man tut, wenn man einen bereits vorhandenen Aktivator ändert. Und man muss aufpassen, dass nicht alle Pungas den vollen Spawn drauf haben. Wenn man die Aktivatoren nicht selbst verteilt, kann es passieren, dass die sich an einem Ort häufen und man in Spawn ertrinkt.

An sich sind Aktivator-Scripte da sinnvoll, wo es gar keinen Spawn gibt. Wenn man mehr Actors will, wo es schon hat, sind Actor-Scripte oder Scripte auf Actor-Effekten sinnvoller. Ich mache es so, dass alle Actors im Spiel spezielle Fraktionen(z.B. wlwTypeGhoul, wlwTypeRobot) kriegen, die von Actor-Scripten ausgelesen werden, etwa so,wie man es in Skyrim mit Keywords macht. Und ich vergebe neue Fraktionen, weil die Vergabe von Fraktionen in Vanilla überhaupt nicht konsistent ist.

Hier mein Actor-Script, das die meisten menschlichen Actors tragen, es gibt ein ähnliches für Viecher.
Hier habe ich das mit dem effektiven Spawn so gelöst, dass zuerst Gegner-Typ und Anzahl ermittelt wird und dann alle 4 Sekunden einer davon gespawnt wird. Das Ziel war, dass nicht fünf Gegner gleichzeitig gespawnt und initialisiert werden und es eventuell Ruckler gibt.
Ausserdem verwende ich ein System, das nicht jeder Actor spawnen kann, obwohl alle das Script haben. Dies, weil eventuell mehrfach fünf Raider gleichzeitig spawnen würden. Also kann ein Gegner erst spawnen, wenn wlwQuestSpawn.IntervalHuman einen Wert über 1 erreicht. Jeder der nicht spawnen kann, erhöht den Wert normalerweise um 0.34, sodass erst der dritte wieder spawnen kann. Da es oft viele Raider hat, erhöhen Raider nur um 0.21.
Dieses Script sollten vor allem generische Gruppen tragen, z.B. LvlRaiderGun oder LvlMutantMelee.

scn wlwSpawnHumanScript
Code:
ref EnemyRef			; Zu spawnende Gegner
short Short1				; Generische Variable
short InventoryChecked	; Ueberfluessige Items abnehmen
short SpawnState		; 0: SpawnLocked, 1: CanSpawn, 2: HasSpawned
short SpawnCount		; Anzahl geladene Gegner
short EnemyCount		; Anzahl zu spawnende Gegner
short EnemyType		; Fuer Ausgabe
short RandomFactor	; Zufallswert
float SpawnInterval	; Genereller Interval
short SpawnTimer		; Interval-Steuerung
float SpawnStep		; Steps zum naechsten Gegner
float PlayerDistance	; Abstand zum Player
short SpawnCap		; Obergrenze Spawn
short SpawnRate		; Rate

Begin OnLoad
	If SpawnState == 0 && wlwQuestSpawn.SpawnLocked == 0 && wlwQuest.EnemyRate > 0
		Set SpawnStep To 0.34
		; Bei Bedarf Spawn verlangsamen
		If GetInFaction wlwTypeRaiderFaction
			Set SpawnStep To 0.21
		ElseIf GetInFaction wlwTypeEnclaveFaction
			Set SpawnStep To 0.21
		EndIf
		If wlwQuestSpawn.IntervalHuman > 1
			Set wlwQuestSpawn.IntervalHuman To 0
			Set SpawnState To 1
			Set SpawnTimer To 6
			Set SpawnRate To wlwQuest.EnemyRate
			Set SpawnCap To wlwQuestSpawn.SpawnCap
		Else
			Set SpawnState To 4
			Set wlwQuestSpawn.IntervalHuman To wlwQuestSpawn.IntervalHuman + SpawnStep
		EndIf
	EndIf
End

Begin GameMode

	; Disabled-Check
	If SpawnState != 4 && (GetDisabled == 1 || GetDead == 1)
		Set SpawnState To 4
	EndIf
	
	; Spawn verzoegern
	If SpawnState == 1
		If SpawnTimer < 0
			Set SpawnCount To GetActorsInHigh
			Set PlayerDistance To GetDistance Player
			If PlayerDistance > 600 && PlayerDistance < 11000 && SpawnCount < SpawnCap
				Set SpawnState To 2
			Else
				If wlwDebugMode == 1
					ShowMessage wlwInfoSpawnHumanFailed PlayerDistance SpawnCount SpawnCap
				EndIf
			EndIf
			Set SpawnTimer To 2000
		Else
			Set SpawnTimer To SpawnTimer - 1
		EndIf
	EndIf
	
	; Spawn ausloesen
	If SpawnState == 2
		Set RandomFactor To GetRandomPercent
		Set EnemyCount To GetRandomPercent * SpawnRate  / 99
		If EnemyCount < (SpawnRate  / 3)
			Set EnemyCount To (SpawnRate  / 3)
		EndIf
		If EnemyCount < 1
			Set EnemyCount To 1
		EndIf
		Set EnemyType To 100 ; Gruppe nicht eruierbar
		If GetInFaction wlwTypeGhoulRaiderFaction
			Set EnemyRef To wlwSpawnGhoulRaider
			Set EnemyType To 101
		ElseIf GetInFaction wlwTypePittRaiderFaction
			Set EnemyRef To wlwSpawnPittRaider
			Set EnemyType To 102
			If GetRandomPercent > 60
				Set EnemyCount To 1
			Else
				Set EnemyCount To 0
			EndIf
		ElseIf GetInFaction wlwTypeRaiderFaction
			Set EnemyRef To wlwSpawnRaiderRandom
			Set EnemyType To 103
		ElseIf GetInFaction wlwTypeSlaverFaction
			Set EnemyRef To wlwSpawnSlaver
			Set EnemyType To 104
		ElseIf GetInFaction wlwTypeSlaveFaction
			Set EnemyRef To wlwSpawnSlave
			Set EnemyType To 105
		ElseIf GetInFaction wlwTypeBanditFaction && wlwQuestGeneric.IsRegionLookout == 1
			Set EnemyRef To wlwSpawnBanditLookout
			Set EnemyType To 106
		ElseIf GetInFaction wlwTypeBanditFaction && wlwQuestGeneric.IsRegionLookout == 0
			Set EnemyRef To wlwSpawnBanditWasteland
			Set EnemyType To 107
		ElseIf GetInFaction wlwTypeTalonFaction
			Set EnemyRef To wlwSpawnTalonRandom
			Set EnemyType To 108		
		ElseIf GetInFaction wlwTypeBrotherhoodFaction
			Set EnemyRef To wlwSpawnBrotherHood
			Set EnemyType To 109
		ElseIf GetInFaction wlwTypeEnclaveFaction
			Set EnemyRef To wlwSpawnEnclave
			Set EnemyType To 110
		ElseIf GetInFaction wlwTypeOutcastFaction
			Set EnemyRef To wlwSpawnOutcast
			Set EnemyType To 111
		ElseIf GetInFaction wlwTypeChineseGhoulFaction
			Set EnemyRef To wlwSpawnChineseGhoulSoldier
			Set EnemyType To 112
		ElseIf GetInFaction wlwTypeUndeadFaction
			Set EnemyRef To wlwSpawnUndead
			Set EnemyType To 113
		ElseIf GetInFaction wlwTypeTribalFaction
			Set EnemyRef To wlwSpawnTribalRandom
			Set EnemyType To 114
		ElseIf GetInFaction wlwTypeWastelandGhoulFaction
			Set EnemyRef To wlwSpawnWastelanderGhoul
			Set EnemyType To 115
		ElseIf GetInFaction wlwTypeWastelanderFaction
			Set EnemyRef To wlwSpawnWastelander
			Set EnemyType To 116
		ElseIf GetInFaction wlwTypeRegulatorFaction
			Set EnemyRef To wlwSpawnRegulator
			Set EnemyType To 117
		ElseIf GetInFaction wlwTypePittSlaveFaction
			Set EnemyRef To wlwSpawnPittSlave
			Set EnemyType To 118
			If GetRandomPercent > 50
				Set EnemyCount To 1
			Else
				Set EnemyCount To 0
			EndIf
		Else
			Set EnemyCount To 0
		EndIf
		Set SpawnTimer To 0
		Set SpawnState To 3
		; Debug-Out
		If wlwDebugMode == 1 && EnemyCount  > 0
			ShowMessage wlwEnemySpawnedHumanMsg EnemyType EnemyCount wlwQuest.EnemyRate SpawnCount 
		EndIf
	EndIf
	
	; Zeitverzoegert spawnen
	If SpawnState == 3 
		If EnemyCount > 0
			If  SpawnTimer > 2
				PlaceAtMe EnemyRef 1
				Set EnemyCount To EnemyCount - 1
				Set SpawnTimer To 0
			Else
				Set SpawnTimer To SpawnTimer + GetSecondsPassed
			EndIf
		Else
			Set SpawnState To 4
		EndIf
	EndIf
	
End