From c87606fd2890c725efd3339ef02ab035c2b5bf42 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Thu, 11 Apr 2019 18:26:12 +0300 Subject: [PATCH] (2ed298287) Add temporal spreading to monster events when spawning multiple monsters. Increase the spatial spread when spawning monsters along the main path. --- .../Source/Events/MonsterEvent.cs | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Events/MonsterEvent.cs b/Barotrauma/BarotraumaShared/Source/Events/MonsterEvent.cs index 236ce85b2..c5db6fa09 100644 --- a/Barotrauma/BarotraumaShared/Source/Events/MonsterEvent.cs +++ b/Barotrauma/BarotraumaShared/Source/Events/MonsterEvent.cs @@ -13,7 +13,7 @@ namespace Barotrauma private int minAmount, maxAmount; - private Character[] monsters; + private List monsters; private bool spawnDeep; @@ -209,6 +209,7 @@ namespace Barotrauma //isActive = false; + bool spawnReady = false; if (spawnPending) { //wait until there are no submarines at the spawnpos @@ -219,25 +220,31 @@ namespace Barotrauma if (Vector2.DistanceSquared(submarine.WorldPosition, spawnPos) < minDist * minDist) return; } + spawnPending = false; + //+1 because Range returns an integer less than the max value int amount = Rand.Range(minAmount, maxAmount + 1, Rand.RandSync.Server); - monsters = new Character[amount]; - + monsters = new List(); + float offsetAmount = spawnPosType == Level.PositionType.MainPath ? 1000 : 100; for (int i = 0; i < amount; i++) - { - bool isClient = false; + { + CoroutineManager.InvokeAfter(() => + { + bool isClient = false; #if CLIENT - isClient = GameMain.Client != null; + isClient = GameMain.Client != null; #endif - - monsters[i] = Character.Create( - characterFile, spawnPos + Rand.Vector(100.0f, Rand.RandSync.Server), - i.ToString(), null, isClient, true, true); + monsters.Add(Character.Create(characterFile, spawnPos + Rand.Vector(offsetAmount, Rand.RandSync.Server), i.ToString(), null, isClient, true, true)); + if (monsters.Count == amount) + { + spawnReady = true; + } + }, Rand.Range(0f, amount / 2, Rand.RandSync.Server)); } - - spawnPending = false; } + if (!spawnReady) { return; } + Entity targetEntity = Submarine.FindClosest(GameMain.GameScreen.Cam.WorldViewCenter); #if CLIENT if (Character.Controlled != null) targetEntity = (Entity)Character.Controlled;