private IEnumerator Start() { while (!hasBeenSetup) { yield return(null); } if (!m_Destination.HasValue) { if (ExpandStats.debugMode) { ETGModConsole.Log("[ExpandTheGungeon] [" + gameObject.name + "] ERROR: Destination Door was not found!"); } m_Disabled = true; } if (!m_Disabled) { if (specRigidbody) { specRigidbody.OnTriggerCollision = (SpeculativeRigidbody.OnTriggerDelegate)Delegate.Combine(specRigidbody.OnTriggerCollision, new SpeculativeRigidbody.OnTriggerDelegate(HandleTriggerCollision)); } } m_parentRoom.RegisterInteractable(Lock); if (isHollowsElevator) { List <IntVector2> CachedPositions = new List <IntVector2>(); IntVector2 RandomGlitchEnemyPosition1 = ExpandObjectDatabase.GetRandomAvailableCellForPlacable(GameManager.Instance.Dungeon, m_parentRoom, CachedPositions, false, true); IntVector2 RandomGlitchEnemyPosition2 = ExpandObjectDatabase.GetRandomAvailableCellForPlacable(GameManager.Instance.Dungeon, m_parentRoom, CachedPositions, false, true); IntVector2 RandomGlitchEnemyPosition3 = ExpandObjectDatabase.GetRandomAvailableCellForPlacable(GameManager.Instance.Dungeon, m_parentRoom, CachedPositions, false, true); ExpandGlitchedEnemies m_GlitchEnemyDatabase = new ExpandGlitchedEnemies(); m_GlitchEnemyDatabase.SpawnGlitchedRat(m_parentRoom, RandomGlitchEnemyPosition1); m_GlitchEnemyDatabase.SpawnGlitchedRat(m_parentRoom, RandomGlitchEnemyPosition2); m_GlitchEnemyDatabase.SpawnGlitchedRat(m_parentRoom, RandomGlitchEnemyPosition3); m_GlitchEnemyDatabase = null; CachedPositions.Clear(); } if (MinimapIcon) { Minimap.Instance.RegisterRoomIcon(m_parentRoom, MinimapIcon, false); } yield break; }
private void EnemyModRandomizer(AIActor targetActor) { if (string.IsNullOrEmpty(targetActor.EnemyGuid)) { return; } if (GameManager.Instance.Dungeon.IsGlitchDungeon && !targetActor.IsBlackPhantom && !string.IsNullOrEmpty(targetActor.EnemyGuid)) { if (UnityEngine.Random.value <= 0.3 && targetActor.healthHaver != null && !ExpandLists.DontGlitchMeList.Contains(targetActor.EnemyGuid) && !ExpandLists.blobsAndCritters.Contains(targetActor.EnemyGuid) && targetActor.EnemyGuid != "5e0af7f7d9de4755a68d2fd3bbc15df4") { if (!targetActor.healthHaver.IsBoss && !targetActor.sprite.usesOverrideMaterial && targetActor.optionalPalette == null) { float RandomIntervalFloat = UnityEngine.Random.Range(0.02f, 0.06f); float RandomDispFloat = UnityEngine.Random.Range(0.1f, 0.16f); float RandomDispIntensityFloat = UnityEngine.Random.Range(0.1f, 0.4f); float RandomColorProbFloat = UnityEngine.Random.Range(0.05f, 0.2f); float RnadomColorIntensityFloat = UnityEngine.Random.Range(0.1f, 0.25f); ExpandShaders.Instance.BecomeGlitched(targetActor, RandomIntervalFloat, RandomDispFloat, RandomDispIntensityFloat, RandomColorProbFloat, RnadomColorIntensityFloat); if (targetActor.GetComponent <ExpandSpawnGlitchObjectOnDeath>() == null) { if (UnityEngine.Random.value <= 0.25) { targetActor.gameObject.AddComponent <ExpandSpawnGlitchObjectOnDeath>(); } } ExpandGlitchedEnemies.GlitchExistingEnemy(targetActor); if (UnityEngine.Random.value <= 0.1f && targetActor.EnemyGuid != "4d37ce3d666b4ddda8039929225b7ede" && targetActor.EnemyGuid != "19b420dec96d4e9ea4aebc3398c0ba7a" && targetActor.GetComponent <ExplodeOnDeath>() == null && targetActor.GetComponent <ExpandSpawnGlitchObjectOnDeath>() == null && targetActor.GetComponent <ExpandSpawnGlitchEnemyOnDeath>() == null) { try { targetActor.gameObject.AddComponent <ExpandExplodeOnDeath>(); } catch (Exception) { } } } } return; } }
public ExpandPlaceGlitchedEnemies() { m_GlitchEnemyDatabase = new ExpandGlitchedEnemies(); }
public ExpandJunkEnemySpawneer() { m_GlitchEnemyDatabase = new ExpandGlitchedEnemies(); }
private void InitObjectMods(Dungeon dungeon) { if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.JUNGLEGEON) { GameObject JungleRainPlacable = new GameObject("ExpandJungleThunderStorm", new System.Type[] { typeof(ExpandThunderStormPlacable) }) { layer = 0 }; JungleRainPlacable.transform.parent = dungeon.gameObject.transform; ExpandThunderStormPlacable ThunderstormPlacable = JungleRainPlacable.GetComponent <ExpandThunderStormPlacable>(); ThunderstormPlacable.useCustomIntensity = true; ThunderstormPlacable.RainIntensity = 425f; ThunderstormPlacable.enableLightning = true; ThunderstormPlacable.isSecretFloor = false; ThunderstormPlacable.ConfigureOnPlacement(null); } if (GameManager.Instance.CurrentFloor == 1) { ExpandStats.HasSpawnedSecretBoss = false; } // Disable victory music for Ser Manuel if not on tutorial floor. (it can cause double music bug if you kill him on other floors) if (dungeon.LevelOverrideType != GameManager.LevelOverrideState.TUTORIAL) { ExpandPrefabs.SerManuel.GetComponent <HealthHaver>().forcePreventVictoryMusic = true; } else { ExpandPrefabs.SerManuel.GetComponent <HealthHaver>().forcePreventVictoryMusic = false; } // Assign pitfall destination to entrance on Floor 1 if in Bossrush mode and special entrance room to Miniboss room path is available. // Glitch Chest floors now added for this since they now have elevator entrance rooms. if (GameManager.Instance.CurrentGameMode == GameManager.GameMode.BOSSRUSH | GameManager.Instance.CurrentGameMode == GameManager.GameMode.SUPERBOSSRUSH | dungeon.IsGlitchDungeon) { foreach (RoomHandler specificRoom in dungeon.data.rooms) { if (!string.IsNullOrEmpty(specificRoom.GetRoomName())) { if (specificRoom.GetRoomName().ToLower().StartsWith("elevatormaintenance") && (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.CASTLEGEON | dungeon.IsGlitchDungeon)) { if (dungeon.data.Entrance != null && dungeon.data.Entrance.GetRoomName().ToLower().StartsWith("elevator entrance")) { dungeon.data.Entrance.TargetPitfallRoom = specificRoom; dungeon.data.Entrance.ForcePitfallForFliers = true; } } } } } if (dungeon.IsGlitchDungeon | ExpandDungeonFlow.isGlitchFlow) { dungeon.BossMasteryTokenItemId = ItemAPI.CustomMasterRounds.CanyonMasterRoundID; foreach (AIActor enemy in FindObjectsOfType <AIActor>()) { if (!enemy.IsBlackPhantom && !enemy.healthHaver.IsBoss && !string.IsNullOrEmpty(enemy.EnemyGuid) && enemy.optionalPalette == null && (string.IsNullOrEmpty(enemy.OverrideDisplayName) | !enemy.OverrideDisplayName.StartsWith("Corrupted"))) { if (!ExpandLists.DontGlitchMeList.Contains(enemy.EnemyGuid)) { if (Random.value <= 0.6f) { ExpandShaders.Instance.BecomeGlitched(enemy, 0.04f, 0.07f, 0.05f, 0.07f, 0.05f); ExpandGlitchedEnemies.GlitchExistingEnemy(enemy); } if (Random.value <= 0.25f && !ExpandLists.blobsAndCritters.Contains(enemy.EnemyGuid) && enemy.GetComponent <ExpandSpawnGlitchObjectOnDeath>() == null) { enemy.gameObject.AddComponent <ExpandSpawnGlitchObjectOnDeath>(); } } } } foreach (BraveBehaviour targetObject in FindObjectsOfType <BraveBehaviour>()) { if (Random.value <= 0.05f && targetObject.gameObject && !targetObject.gameObject.GetComponent <AIActor>() && !targetObject.gameObject.GetComponent <Chest>()) { if (string.IsNullOrEmpty(targetObject.gameObject.name) | (!targetObject.gameObject.name.ToLower().StartsWith("glitchtile") && !targetObject.gameObject.name.ToLower().StartsWith("ex secret door") && !targetObject.gameObject.name.ToLower().StartsWith("lock") && !targetObject.gameObject.name.ToLower().StartsWith("chest"))) { float RandomIntervalFloat = Random.Range(0.02f, 0.04f); float RandomDispFloat = Random.Range(0.06f, 0.08f); float RandomDispIntensityFloat = Random.Range(0.07f, 0.1f); float RandomColorProbFloat = Random.Range(0.035f, 0.1f); float RandomColorIntensityFloat = Random.Range(0.05f, 0.1f); ExpandShaders.Instance.BecomeGlitched(targetObject, RandomIntervalFloat, RandomDispFloat, RandomDispIntensityFloat, RandomColorProbFloat, RandomColorIntensityFloat); } } } ExpandPlaceGlitchedEnemies m_GlitchEnemyRandomizer = new ExpandPlaceGlitchedEnemies(); m_GlitchEnemyRandomizer.PlaceRandomEnemies(dungeon, GameManager.Instance.CurrentFloor); Destroy(m_GlitchEnemyRandomizer); MaybeSetupGlitchEnemyStun(dungeon); } }
private void HandleChooseCorruptionEnemySource() { aiActor.enabled = false; behaviorSpeculator.enabled = false; aiActor.ToggleRenderers(false); specRigidbody.enabled = false; aiActor.IsGone = true; RoomHandler currentRoom = transform.position.GetAbsoluteRoom(); IntVector2 cachedPosition = (transform.PositionVector2().ToIntVector2() - currentRoom.area.basePosition); // bool WillBeBigEnemy = UnityEngine.Random.value <= 0.2f; // bool WillBeGlitchObject = UnityEngine.Random.value <= 0.2f; if (aiShooter) { aiShooter.ToggleGunAndHandRenderers(false, "ExpandCorruptedEnemyEngageDoer"); } GameObject newEnemy = null; ExpandGlitchedEnemies glitchedEnemies = new ExpandGlitchedEnemies(); try { newEnemy = glitchedEnemies.SpawnRandomGlitchEnemy(currentRoom, cachedPosition, true); } catch (Exception) { // If something broke, destroy broken Enemy (if it exist) to prevent possible softlocks. if (newEnemy) { if (newEnemy.GetComponent <AIActor>()) { currentRoom.DeregisterEnemy(newEnemy.GetComponent <AIActor>()); } Destroy(newEnemy); } } glitchedEnemies = null; if (newEnemy && newEnemy.GetComponent <AIActor>()) { newEnemy.GetComponent <AIActor>().aiAnimator.PlayDefaultAwakenedState(); newEnemy.GetComponent <AIActor>().aiActor.State = AIActor.ActorState.Normal; newEnemy.GetComponent <AIActor>().aiActor.invisibleUntilAwaken = false; } currentRoom.DeregisterEnemy(aiActor); Destroy(gameObject); return; /*string SelectedEnemyToBecome; * * if (WillBeBigEnemy) { * SelectedEnemyToBecome = BraveUtility.RandomElement(ValidTransformSpecialEnemies); * } else { * SelectedEnemyToBecome = BraveUtility.RandomElement(ValidTransformEnemies); * ValidSourceEnemies.Remove(SelectedEnemyToBecome); * } * * string SelectedEnemyToUseAttacks = BraveUtility.RandomElement(ValidSourceEnemies); * * ReplaceEnemyData(SelectedEnemyToBecome, SelectedEnemyToUseAttacks, WillBeBigEnemy, WillBeGlitchObject); * * aiActor.enabled = true; * RegenerateCache(); * behaviorSpeculator.enabled = true; * behaviorSpeculator.RegenerateCache(); * // behaviorSpeculator.RefreshBehaviors(); * aiActor.ToggleRenderers(true); * if (aiShooter) { aiShooter.ToggleGunAndHandRenderers(true, "ExpandCorruptedEnemyEngageDoer"); } * specRigidbody.enabled = true; * specRigidbody.RegenerateCache(); * specRigidbody.RegenerateColliders = true; * // specRigidbody.Reinitialize(); * healthHaver.RegenerateCache(); * aiActor.IsGone = false; * aiAnimator.PlayDefaultAwakenedState(); * aiActor.State = AIActor.ActorState.Normal; * aiActor.invisibleUntilAwaken = false; * // transform.position = cachedPosition; * // specRigidbody.Reinitialize(); * return;*/ }
private void SpawnEnemies(string[] selectedEnemyGuids) { if (useGlitchedActorPrefab) { IntVector2 pos = specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor); if (aiActor.IsFalling && !IsGlitchedLJ) { return; } if (GameManager.Instance.Dungeon.CellIsPit(specRigidbody.UnitCenter.ToVector3ZUp(0f)) && !IsGlitchedLJ) { return; } RoomHandler roomFromPosition = GameManager.Instance.Dungeon.GetRoomFromPosition(pos); List <SpeculativeRigidbody> list = new List <SpeculativeRigidbody>(); list.Add(specRigidbody); Vector2 unitBottomLeft = specRigidbody.UnitBottomLeft; for (int i = 0; i < ActorPrefabSpawnCount; i++) { if (IsGlitchedLJ) { if (transform.position.GetAbsoluteRoom() != null) { ExpandGlitchedEnemies m_GlitchedEnemyDatabase = new ExpandGlitchedEnemies(); RoomHandler CurrentRoom = transform.position.GetAbsoluteRoom(); IntVector2 actorPosition = specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor) - CurrentRoom.area.basePosition; m_GlitchedEnemyDatabase.SpawnGlitchedSuperReaper(CurrentRoom, actorPosition); Destroy(m_GlitchedEnemyDatabase); return; } } else { if (ActorObjectTarget == null) { return; } AIActor.AwakenAnimationType AnimationType = AIActor.AwakenAnimationType.Default; AIActor aiactor = null; GameObject CachedTargetActorObject = Instantiate(ActorObjectTarget); bool ExplodesOnDeath = false; bool spawnsGlitchedObjectOnDeath = false; if (UnityEngine.Random.value <= 0.25f) { ExplodesOnDeath = true; } if (UnityEngine.Random.value <= 0.15f) { spawnsGlitchedObjectOnDeath = true; } ExpandGlitchedEnemies m_GlitchedEnemyDatabase = new ExpandGlitchedEnemies(); aiactor = AIActor.Spawn(m_GlitchedEnemyDatabase.GenerateGlitchedActorPrefab(CachedTargetActorObject, ActorOverrideSource, ExplodesOnDeath, spawnsGlitchedObjectOnDeath), specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor), roomFromPosition, true, AnimationType, true); Destroy(m_GlitchedEnemyDatabase); if (aiactor == null) { return; } if (aiActor.IsBlackPhantom) { aiactor.BecomeBlackPhantom(); } if (aiactor) { aiactor.specRigidbody.Initialize(); Vector2 a = unitBottomLeft - (aiactor.specRigidbody.UnitBottomLeft - aiactor.transform.position.XY()); Vector2 vector = a + new Vector2(Mathf.Max(0f, specRigidbody.UnitDimensions.x - aiactor.specRigidbody.UnitDimensions.x), 0f); aiactor.transform.position = Vector2.Lerp(a, vector, (ActorPrefabSpawnCount != 1) ? i / (ActorPrefabSpawnCount - 1f) : 0f); aiactor.specRigidbody.Reinitialize(); a -= new Vector2(PhysicsEngine.PixelToUnit(extraPixelWidth), 0f); vector += new Vector2(PhysicsEngine.PixelToUnit(extraPixelWidth), 0f); Vector2 a2 = Vector2.Lerp(a, vector, (ActorPrefabSpawnCount != 1) ? i / (ActorPrefabSpawnCount - 1f) : 0.5f); IntVector2 intVector = PhysicsEngine.UnitToPixel(a2 - aiactor.transform.position.XY()); CollisionData collisionData = null; if (PhysicsEngine.Instance.RigidbodyCastWithIgnores(aiactor.specRigidbody, intVector, out collisionData, true, true, null, false, list.ToArray())) { intVector = collisionData.NewPixelsToMove; } CollisionData.Pool.Free(ref collisionData); aiactor.transform.position += PhysicsEngine.PixelToUnit(intVector).ToVector3ZUp(1f); aiactor.specRigidbody.Reinitialize(); if (i == 0) { aiactor.aiAnimator.FacingDirection = 180f; } else if (i == ActorPrefabSpawnCount - 1) { aiactor.aiAnimator.FacingDirection = 0f; } HandleSpawn(aiactor); list.Add(aiactor.specRigidbody); Destroy(CachedTargetActorObject); } } } if (list.Count > 0) { for (int j = 0; j < list.Count; j++) { for (int k = 0; k < list.Count; k++) { if (j != k) { list[j].RegisterGhostCollisionException(list[k]); } } } } } else if (spawnPosition == SpawnPosition.InsideCollider) { IntVector2 pos = specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor); if (aiActor.IsFalling) { return; } if (GameManager.Instance.Dungeon.CellIsPit(specRigidbody.UnitCenter.ToVector3ZUp(0f))) { return; } RoomHandler roomFromPosition = GameManager.Instance.Dungeon.GetRoomFromPosition(pos); List <SpeculativeRigidbody> list = new List <SpeculativeRigidbody>(); list.Add(specRigidbody); Vector2 unitBottomLeft = specRigidbody.UnitBottomLeft; for (int i = 0; i < selectedEnemyGuids.Length; i++) { AIActor orLoadByGuid = EnemyDatabase.GetOrLoadByGuid(selectedEnemyGuids[i]); AIActor aiactor = AIActor.Spawn(orLoadByGuid, specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor), roomFromPosition, false, AIActor.AwakenAnimationType.Default, true); if (aiActor.IsBlackPhantom) { aiactor.ForceBlackPhantom = true; } if (aiactor) { aiactor.specRigidbody.Initialize(); Vector2 a = unitBottomLeft - (aiactor.specRigidbody.UnitBottomLeft - aiactor.transform.position.XY()); Vector2 vector = a + new Vector2(Mathf.Max(0f, specRigidbody.UnitDimensions.x - aiactor.specRigidbody.UnitDimensions.x), 0f); aiactor.transform.position = Vector2.Lerp(a, vector, (selectedEnemyGuids.Length != 1) ? i / (selectedEnemyGuids.Length - 1f) : 0f); aiactor.specRigidbody.Reinitialize(); a -= new Vector2(PhysicsEngine.PixelToUnit(extraPixelWidth), 0f); vector += new Vector2(PhysicsEngine.PixelToUnit(extraPixelWidth), 0f); Vector2 a2 = Vector2.Lerp(a, vector, (selectedEnemyGuids.Length != 1) ? i / (selectedEnemyGuids.Length - 1f) : 0.5f); IntVector2 intVector = PhysicsEngine.UnitToPixel(a2 - aiactor.transform.position.XY()); CollisionData collisionData = null; if (PhysicsEngine.Instance.RigidbodyCastWithIgnores(aiactor.specRigidbody, intVector, out collisionData, true, true, null, false, list.ToArray())) { intVector = collisionData.NewPixelsToMove; } CollisionData.Pool.Free(ref collisionData); // aiactor.transform.position += PhysicsEngine.PixelToUnit(intVector); aiactor.transform.position += PhysicsEngine.PixelToUnit(intVector).ToVector3ZUp(1f); aiactor.specRigidbody.Reinitialize(); if (i == 0) { aiactor.aiAnimator.FacingDirection = 180f; } else if (i == selectedEnemyGuids.Length - 1) { aiactor.aiAnimator.FacingDirection = 0f; } HandleSpawn(aiactor); list.Add(aiactor.specRigidbody); } } for (int j = 0; j < list.Count; j++) { for (int k = 0; k < list.Count; k++) { if (j != k) { list[j].RegisterGhostCollisionException(list[k]); } } } } else if (spawnPosition == SpawnPosition.ScreenEdge) { for (int l = 0; l < selectedEnemyGuids.Length; l++) { AIActor orLoadByGuid2 = EnemyDatabase.GetOrLoadByGuid(selectedEnemyGuids[l]); AIActor spawnedActor = AIActor.Spawn(orLoadByGuid2, specRigidbody.UnitCenter.ToIntVector2(VectorConversions.Floor), aiActor.ParentRoom, false, AIActor.AwakenAnimationType.Default, true); if (spawnedActor) { Vector2 cameraBottomLeft = BraveUtility.ViewportToWorldpoint(new Vector2(0f, 0f), ViewportType.Gameplay); Vector2 cameraTopRight = BraveUtility.ViewportToWorldpoint(new Vector2(1f, 1f), ViewportType.Gameplay); IntVector2 bottomLeft = cameraBottomLeft.ToIntVector2(VectorConversions.Ceil); IntVector2 topRight = cameraTopRight.ToIntVector2(VectorConversions.Floor) - IntVector2.One; CellValidator cellValidator = delegate(IntVector2 c) { for (int num2 = 0; num2 < spawnedActor.Clearance.x; num2++) { for (int num3 = 0; num3 < spawnedActor.Clearance.y; num3++) { if (GameManager.Instance.Dungeon.data.isTopWall(c.x + num2, c.y + num3)) { return(false); } if (GameManager.Instance.Dungeon.data[c.x + num2, c.y + num3].isExitCell) { return(false); } } } return(c.x >= bottomLeft.x && c.y >= bottomLeft.y && c.x + spawnedActor.Clearance.x - 1 <= topRight.x && c.y + spawnedActor.Clearance.y - 1 <= topRight.y); }; Func <IntVector2, float> cellWeightFinder = delegate(IntVector2 c) { float a3 = float.MaxValue; a3 = Mathf.Min(a3, c.x - cameraBottomLeft.x); a3 = Mathf.Min(a3, c.y - cameraBottomLeft.y); a3 = Mathf.Min(a3, cameraTopRight.x - c.x + spawnedActor.Clearance.x); return(Mathf.Min(a3, cameraTopRight.y - c.y + spawnedActor.Clearance.y)); }; Vector2 b = spawnedActor.specRigidbody.UnitCenter - spawnedActor.transform.position.XY(); IntVector2?randomWeightedAvailableCell = spawnedActor.ParentRoom.GetRandomWeightedAvailableCell(new IntVector2?(spawnedActor.Clearance), new CellTypes?(spawnedActor.PathableTiles), false, cellValidator, cellWeightFinder, 0.25f); if (randomWeightedAvailableCell == null) { Debug.LogError("Screen Edge Spawn FAILED!", spawnedActor); Destroy(spawnedActor); } else { spawnedActor.transform.position = Pathfinder.GetClearanceOffset(randomWeightedAvailableCell.Value, spawnedActor.Clearance) - b; spawnedActor.specRigidbody.Reinitialize(); HandleSpawn(spawnedActor); } } } } else if (spawnPosition == SpawnPosition.InsideRadius) { Vector2 unitCenter = specRigidbody.GetUnitCenter(ColliderType.HitBox); List <SpeculativeRigidbody> list2 = new List <SpeculativeRigidbody>(); list2.Add(specRigidbody); for (int m = 0; m < selectedEnemyGuids.Length; m++) { Vector2 vector2 = unitCenter + UnityEngine.Random.insideUnitCircle * spawnRadius; if (GameManager.Instance.CurrentLevelOverrideState == GameManager.LevelOverrideState.CHARACTER_PAST && SceneManager.GetActiveScene().name == "fs_robot") { RoomHandler entrance = GameManager.Instance.Dungeon.data.Entrance; Vector2 lhs = entrance.area.basePosition.ToVector2() + new Vector2(7f, 7f); Vector2 lhs2 = entrance.area.basePosition.ToVector2() + new Vector2(38f, 36f); vector2 = Vector2.Min(lhs2, Vector2.Max(lhs, vector2)); } AIActor orLoadByGuid3 = EnemyDatabase.GetOrLoadByGuid(selectedEnemyGuids[m]); AIActor aiactor2 = AIActor.Spawn(orLoadByGuid3, unitCenter.ToIntVector2(VectorConversions.Floor), aiActor.ParentRoom, true, AIActor.AwakenAnimationType.Default, true); if (aiactor2) { aiactor2.specRigidbody.Initialize(); Vector2 unit = vector2 - aiactor2.specRigidbody.GetUnitCenter(ColliderType.HitBox); aiactor2.specRigidbody.ImpartedPixelsToMove = PhysicsEngine.UnitToPixel(unit); HandleSpawn(aiactor2); list2.Add(aiactor2.specRigidbody); } } for (int n = 0; n < list2.Count; n++) { for (int num = 0; num < list2.Count; num++) { if (n != num) { list2[n].RegisterGhostCollisionException(list2[num]); } } } } else { Debug.LogError("Unknown spawn type: " + spawnPosition); } }