public override void PurchaseItem(ShopItemController itemBad, bool actualPurchase = true, bool allowSign = true) { var item = itemBad as CustomShopItemController; float heightOffGround = -1f; if (item && item.sprite) { heightOffGround = item.sprite.HeightOffGround; } if (actualPurchase) { if (giveStatsOnPurchase) { foreach (var stat in statsToGive) { item.LastInteractingPlayer.ownerlessStatModifiers.Add(stat); } item.LastInteractingPlayer.stats.RecalculateStats(item.LastInteractingPlayer, false, false); } if (this.shopkeepFSM != null) { FsmObject fsmObject = this.shopkeepFSM.FsmVariables.FindFsmObject("referencedItem"); if (fsmObject != null) { fsmObject.Value = item; } this.shopkeepFSM.SendEvent("succeedPurchase"); } } if (!item.item.PersistsOnPurchase) { if (allowSign) { GameObject gameObject = (GameObject)UnityEngine.Object.Instantiate(BraveResources.Load("Global Prefabs/Sign_SoldOut", ".prefab")); tk2dBaseSprite component = gameObject.GetComponent <tk2dBaseSprite>(); component.PlaceAtPositionByAnchor(item.sprite.WorldCenter, tk2dBaseSprite.Anchor.MiddleCenter); gameObject.transform.position = gameObject.transform.position.Quantize(0.0625f); component.HeightOffGround = heightOffGround; component.UpdateZDepth(); } GameObject gameObject2 = (GameObject)UnityEngine.Object.Instantiate(ResourceCache.Acquire("Global VFX/VFX_Item_Spawn_Poof")); tk2dBaseSprite component2 = gameObject2.GetComponent <tk2dBaseSprite>(); component2.PlaceAtPositionByAnchor(item.sprite.WorldCenter.ToVector3ZUp(0f), tk2dBaseSprite.Anchor.MiddleCenter); component2.transform.position = component2.transform.position.Quantize(0.0625f); component2.HeightOffGround = 5f; component2.UpdateZDepth(); this.m_room.DeregisterInteractable(item); UnityEngine.Object.Destroy(item.gameObject); } }
public void ConfigureOnPlacement(RoomHandler room) { m_ParentRoom = room; if (!m_itemDisplaySprite) { if (!contents) { contents = PickupObjectDatabase.GetById(ItemID); } if (!contents) { return; } m_itemDisplaySprite = tk2dSprite.AddComponent(new GameObject("Display Sprite") { transform = { parent = spawnTransform } }, contents.sprite.Collection, contents.sprite.spriteId); if (AddOutline) { SpriteOutlineManager.AddOutlineToSprite(m_itemDisplaySprite, Color.black, 0.1f, 0.05f, SpriteOutlineManager.OutlineType.NORMAL); } sprite.AttachRenderer(m_itemDisplaySprite); m_itemDisplaySprite.HeightOffGround = 0.25f; m_itemDisplaySprite.depthUsesTrimmedBounds = true; m_itemDisplaySprite.PlaceAtPositionByAnchor(spawnTransform.position, tk2dBaseSprite.Anchor.LowerCenter); m_itemDisplaySprite.transform.position = m_itemDisplaySprite.transform.position.Quantize(0.0625f); if (DoSpawnVFX) { GameObject gameObject = Instantiate((GameObject)ResourceCache.Acquire("Global VFX/VFX_Item_Spawn_Poof")); tk2dBaseSprite component = gameObject.GetComponent <tk2dBaseSprite>(); component.PlaceAtPositionByAnchor(m_itemDisplaySprite.WorldCenter.ToVector3ZUp(0f), tk2dBaseSprite.Anchor.MiddleCenter); component.HeightOffGround = 5f; component.UpdateZDepth(); } sprite.UpdateZDepth(); } }
private IEnumerator HandleEnemyDeath(AIActor target) { tk2dBaseSprite sprite = Instantiate(SmiteVFX, target.CenterPosition, Quaternion.identity).GetComponent <tk2dBaseSprite>(); sprite.HeightOffGround = 20f; sprite.UpdateZDepth(); target.EraseFromExistenceWithRewards(false); Transform copyTransform = this.CreateEmptySprite(target); tk2dSprite copySprite = copyTransform.GetComponentInChildren <tk2dSprite>(); GameObject gameObject = Instantiate(Toolbox.GetGunById(519).alternateVolley.projectiles[0].projectiles[0].GetComponent <CombineEvaporateEffect>().ParticleSystemToSpawn, copySprite.WorldCenter.ToVector3ZisY(0f), Quaternion.identity); gameObject.transform.parent = copyTransform; float elapsed = 0f; float duration = 2.5f; copySprite.renderer.material.DisableKeyword("TINTING_OFF"); copySprite.renderer.material.EnableKeyword("TINTING_ON"); copySprite.renderer.material.DisableKeyword("EMISSIVE_OFF"); copySprite.renderer.material.EnableKeyword("EMISSIVE_ON"); copySprite.renderer.material.DisableKeyword("BRIGHTNESS_CLAMP_ON"); copySprite.renderer.material.EnableKeyword("BRIGHTNESS_CLAMP_OFF"); copySprite.renderer.material.SetFloat("_EmissiveThresholdSensitivity", 5f); copySprite.renderer.material.SetFloat("_EmissiveColorPower", 1f); int emId = Shader.PropertyToID("_EmissivePower"); while (elapsed < duration) { elapsed += BraveTime.DeltaTime; float t = elapsed / duration; copySprite.renderer.material.SetFloat(emId, Mathf.Lerp(1f, 10f, t)); copySprite.renderer.material.SetFloat("_BurnAmount", t); copyTransform.position += Vector3.up * BraveTime.DeltaTime * 1f; yield return(null); } Destroy(copyTransform.gameObject); yield break; }
private void ExpandMoveObjectBetweenRooms(Transform foundObject, RoomHandler fromRoom, RoomHandler toRoom) { Vector2 b = foundObject.position.XY() - fromRoom.area.basePosition.ToVector2(); Vector2 v = toRoom.area.basePosition.ToVector2() + b; foundObject.transform.position = v; if (foundObject.parent == fromRoom.hierarchyParent) { foundObject.parent = toRoom.hierarchyParent; } SpeculativeRigidbody component = foundObject.GetComponent <SpeculativeRigidbody>(); if (component) { component.Reinitialize(); } tk2dBaseSprite component2 = foundObject.GetComponent <tk2dBaseSprite>(); if (component2) { component2.UpdateZDepth(); } }
protected IEnumerator ExpandHandleSeamlessTransitionToCombatRoomHook(Action <PaydayDrillItem, RoomHandler, Chest> orig, PaydayDrillItem self, RoomHandler sourceRoom, Chest sourceChest) { Dungeon dungeon = GameManager.Instance.Dungeon; if (dungeon.tileIndices.tilesetId == GlobalDungeonData.ValidTilesets.JUNGLEGEON) { GameManager.Instance.StartCoroutine(ExpandHandleTransitionToFallbackCombatRoom(self, sourceRoom, sourceChest)); yield break; } else { sourceChest.majorBreakable.TemporarilyInvulnerable = true; sourceRoom.DeregisterInteractable(sourceChest); int tmapExpansion = 13; RoomHandler newRoom = dungeon.RuntimeDuplicateChunk(sourceRoom.area.basePosition, sourceRoom.area.dimensions, tmapExpansion, sourceRoom, true); newRoom.CompletelyPreventLeaving = true; List <Transform> movedObjects = new List <Transform>(); string[] c_rewardRoomObjects = ReflectionHelpers.ReflectGetField <string[]>(typeof(PaydayDrillItem), "c_rewardRoomObjects", self); for (int i = 0; i < c_rewardRoomObjects.Length; i++) { Transform transform = sourceRoom.hierarchyParent.Find(c_rewardRoomObjects[i]); if (transform) { movedObjects.Add(transform); ExpandMoveObjectBetweenRooms(transform, sourceRoom, newRoom); } } ExpandMoveObjectBetweenRooms(sourceChest.transform, sourceRoom, newRoom); if (sourceChest.specRigidbody) { PathBlocker.BlockRigidbody(sourceChest.specRigidbody, false); } Vector3 m_baseChestOffset = ReflectionHelpers.ReflectGetField <Vector3>(typeof(PaydayDrillItem), "m_baseChestOffset", self); Vector3 m_largeChestOffset = ReflectionHelpers.ReflectGetField <Vector3>(typeof(PaydayDrillItem), "m_largeChestOffset", self); Vector3 chestOffset = m_baseChestOffset; if (sourceChest.name.Contains("_Red") || sourceChest.name.Contains("_Black")) { chestOffset += m_largeChestOffset; } GameObject spawnedVFX = SpawnManager.SpawnVFX(self.DrillVFXPrefab, sourceChest.transform.position + chestOffset, Quaternion.identity); tk2dBaseSprite spawnedSprite = spawnedVFX.GetComponent <tk2dBaseSprite>(); spawnedSprite.HeightOffGround = 1f; spawnedSprite.UpdateZDepth(); Vector2 oldPlayerPosition = GameManager.Instance.BestActivePlayer.transform.position.XY(); Vector2 playerOffset = oldPlayerPosition - sourceRoom.area.basePosition.ToVector2(); Vector2 newPlayerPosition = newRoom.area.basePosition.ToVector2() + playerOffset; Pixelator.Instance.FadeToColor(0.25f, Color.white, true, 0.125f); Pathfinder.Instance.InitializeRegion(dungeon.data, newRoom.area.basePosition, newRoom.area.dimensions); GameManager.Instance.BestActivePlayer.WarpToPoint(newPlayerPosition, false, false); if (GameManager.Instance.CurrentGameType == GameManager.GameType.COOP_2_PLAYER) { GameManager.Instance.GetOtherPlayer(GameManager.Instance.BestActivePlayer).ReuniteWithOtherPlayer(GameManager.Instance.BestActivePlayer, false); } yield return(null); for (int j = 0; j < GameManager.Instance.AllPlayers.Length; j++) { GameManager.Instance.AllPlayers[j].WarpFollowersToPlayer(false); GameManager.Instance.AllPlayers[j].WarpCompanionsToPlayer(false); } yield return(dungeon.StartCoroutine(HandleCombatRoomExpansion(self, sourceRoom, newRoom, sourceChest))); self.DisappearDrillPoof.SpawnAtPosition(spawnedSprite.WorldBottomLeft + new Vector2(-0.0625f, 0.25f), 0f, null, null, null, new float?(3f), false, null, null, false); Destroy(spawnedVFX.gameObject); sourceChest.ForceUnlock(); AkSoundEngine.PostEvent("Stop_OBJ_paydaydrill_loop_01", GameManager.Instance.gameObject); AkSoundEngine.PostEvent("Play_OBJ_item_spawn_01", GameManager.Instance.gameObject); bool goodToGo = false; while (!goodToGo) { goodToGo = true; for (int k = 0; k < GameManager.Instance.AllPlayers.Length; k++) { float num = Vector2.Distance(sourceChest.specRigidbody.UnitCenter, GameManager.Instance.AllPlayers[k].CenterPosition); if (num > 3f) { goodToGo = false; } } yield return(null); } GameManager.Instance.MainCameraController.SetManualControl(true, true); GameManager.Instance.MainCameraController.OverridePosition = GameManager.Instance.BestActivePlayer.CenterPosition; for (int l = 0; l < GameManager.Instance.AllPlayers.Length; l++) { GameManager.Instance.AllPlayers[l].SetInputOverride("shrinkage"); } yield return(dungeon.StartCoroutine(HandleCombatRoomShrinking(newRoom))); for (int m = 0; m < GameManager.Instance.AllPlayers.Length; m++) { GameManager.Instance.AllPlayers[m].ClearInputOverride("shrinkage"); } Pixelator.Instance.FadeToColor(0.25f, Color.white, true, 0.125f); AkSoundEngine.PostEvent("Play_OBJ_paydaydrill_end_01", GameManager.Instance.gameObject); GameManager.Instance.MainCameraController.SetManualControl(false, false); GameManager.Instance.BestActivePlayer.WarpToPoint(oldPlayerPosition, false, false); if (GameManager.Instance.CurrentGameType == GameManager.GameType.COOP_2_PLAYER) { GameManager.Instance.GetOtherPlayer(GameManager.Instance.BestActivePlayer).ReuniteWithOtherPlayer(GameManager.Instance.BestActivePlayer, false); } ExpandMoveObjectBetweenRooms(sourceChest.transform, newRoom, sourceRoom); for (int n = 0; n < movedObjects.Count; n++) { ExpandMoveObjectBetweenRooms(movedObjects[n], newRoom, sourceRoom); } sourceRoom.RegisterInteractable(sourceChest); FieldInfo m_inEffectField = typeof(PaydayDrillItem).GetField("m_inEffect", BindingFlags.Instance | BindingFlags.NonPublic); m_inEffectField.SetValue(self, false); } yield break; }
protected IEnumerator ExpandHandleTransitionToFallbackCombatRoom(PaydayDrillItem drillItem, RoomHandler sourceRoom, Chest sourceChest) { Dungeon d = GameManager.Instance.Dungeon; sourceChest.majorBreakable.TemporarilyInvulnerable = true; sourceRoom.DeregisterInteractable(sourceChest); // RoomHandler newRoom = ExpandUtility.Instance.AddCustomRuntimeRoom(drillItem.GenericFallbackCombatRoom, true, false, lightStyle: DungeonData.LightGenerationStyle.STANDARD); RoomHandler newRoom = d.AddRuntimeRoom(drillItem.GenericFallbackCombatRoom, null, DungeonData.LightGenerationStyle.FORCE_COLOR); newRoom.CompletelyPreventLeaving = true; Vector3 oldChestPosition = sourceChest.transform.position; sourceChest.transform.position = newRoom.Epicenter.ToVector3(); if (sourceChest.transform.parent == sourceRoom.hierarchyParent) { sourceChest.transform.parent = newRoom.hierarchyParent; } SpeculativeRigidbody component = sourceChest.GetComponent <SpeculativeRigidbody>(); if (component) { component.Reinitialize(); PathBlocker.BlockRigidbody(component, false); } tk2dBaseSprite component2 = sourceChest.GetComponent <tk2dBaseSprite>(); if (component2) { component2.UpdateZDepth(); } Vector3 m_baseChestOffset = ReflectionHelpers.ReflectGetField <Vector3>(typeof(PaydayDrillItem), "m_baseChestOffset", drillItem); Vector3 m_largeChestOffset = ReflectionHelpers.ReflectGetField <Vector3>(typeof(PaydayDrillItem), "m_largeChestOffset", drillItem); Vector3 chestOffset = m_baseChestOffset; if (sourceChest.name.Contains("_Red") || sourceChest.name.Contains("_Black")) { chestOffset += m_largeChestOffset; } GameObject spawnedVFX = SpawnManager.SpawnVFX(drillItem.DrillVFXPrefab, sourceChest.transform.position + chestOffset, Quaternion.identity); tk2dBaseSprite spawnedSprite = spawnedVFX.GetComponent <tk2dBaseSprite>(); spawnedSprite.HeightOffGround = 1f; spawnedSprite.UpdateZDepth(); Vector2 oldPlayerPosition = GameManager.Instance.BestActivePlayer.transform.position.XY(); Vector2 newPlayerPosition = newRoom.Epicenter.ToVector2() + new Vector2(0f, -3f); Pixelator.Instance.FadeToColor(0.25f, Color.white, true, 0.125f); Pathfinder.Instance.InitializeRegion(d.data, newRoom.area.basePosition, newRoom.area.dimensions); GameManager.Instance.BestActivePlayer.WarpToPoint(newPlayerPosition, false, false); if (GameManager.Instance.CurrentGameType == GameManager.GameType.COOP_2_PLAYER) { GameManager.Instance.GetOtherPlayer(GameManager.Instance.BestActivePlayer).ReuniteWithOtherPlayer(GameManager.Instance.BestActivePlayer, false); } yield return(null); for (int i = 0; i < GameManager.Instance.AllPlayers.Length; i++) { GameManager.Instance.AllPlayers[i].WarpFollowersToPlayer(false); GameManager.Instance.AllPlayers[i].WarpCompanionsToPlayer(false); } yield return(new WaitForSeconds(drillItem.DelayPostExpansionPreEnemies)); yield return(GameManager.Instance.StartCoroutine(ExpandHandleCombatWaves(drillItem, d, newRoom, sourceChest))); drillItem.DisappearDrillPoof.SpawnAtPosition(spawnedSprite.WorldBottomLeft + new Vector2(-0.0625f, 0.25f), 0f, null, null, null, new float?(3f), false, null, null, false); Destroy(spawnedVFX.gameObject); AkSoundEngine.PostEvent("Stop_OBJ_paydaydrill_loop_01", GameManager.Instance.gameObject); AkSoundEngine.PostEvent("Play_OBJ_item_spawn_01", GameManager.Instance.gameObject); sourceChest.ForceUnlock(); bool goodToGo = false; while (!goodToGo) { goodToGo = true; for (int j = 0; j < GameManager.Instance.AllPlayers.Length; j++) { float num = Vector2.Distance(sourceChest.specRigidbody.UnitCenter, GameManager.Instance.AllPlayers[j].CenterPosition); if (num > 3f) { goodToGo = false; } } yield return(null); } Pixelator.Instance.FadeToColor(0.25f, Color.white, true, 0.125f); GameManager.Instance.BestActivePlayer.WarpToPoint(oldPlayerPosition, false, false); if (GameManager.Instance.CurrentGameType == GameManager.GameType.COOP_2_PLAYER) { GameManager.Instance.GetOtherPlayer(GameManager.Instance.BestActivePlayer).ReuniteWithOtherPlayer(GameManager.Instance.BestActivePlayer, false); } sourceChest.transform.position = oldChestPosition; if (sourceChest.transform.parent == newRoom.hierarchyParent) { sourceChest.transform.parent = sourceRoom.hierarchyParent; } SpeculativeRigidbody component3 = sourceChest.GetComponent <SpeculativeRigidbody>(); if (component3) { component3.Reinitialize(); } tk2dBaseSprite component4 = sourceChest.GetComponent <tk2dBaseSprite>(); if (component4) { component4.UpdateZDepth(); } sourceRoom.RegisterInteractable(sourceChest); FieldInfo m_inEffectField = typeof(PaydayDrillItem).GetField("m_inEffect", BindingFlags.Instance | BindingFlags.NonPublic); m_inEffectField.SetValue(drillItem, false); // m_inEffect = false; yield break; }
private IEnumerator BecomeMimic() { if (m_hands == null) { StartCoroutine(DoIntro()); } if (!ChaosConsole.WallMimicsUseRewardManager) { m_ChaosModeActive = true; } if (m_GlitchModeActive) { m_ItemDropOdds += 0.2f; m_FriendlyMimicOdds += 0.2f; } m_isHidden = false; SpeculativeRigidbody specRigidbody = this.specRigidbody; specRigidbody.OnRigidbodyCollision = (SpeculativeRigidbody.OnRigidbodyCollisionDelegate)Delegate.Remove(specRigidbody.OnRigidbodyCollision, new SpeculativeRigidbody.OnRigidbodyCollisionDelegate(HandleRigidbodyCollision)); SpeculativeRigidbody specRigidbody2 = this.specRigidbody; specRigidbody2.OnBeamCollision = (SpeculativeRigidbody.OnBeamCollisionDelegate)Delegate.Remove(specRigidbody2.OnBeamCollision, new SpeculativeRigidbody.OnBeamCollisionDelegate(HandleBeamCollision)); AIAnimator tongueAnimator = aiAnimator.ChildAnimator; tongueAnimator.renderer.enabled = true; tongueAnimator.spriteAnimator.enabled = true; AIAnimator spitAnimator = tongueAnimator.ChildAnimator; spitAnimator.renderer.enabled = true; spitAnimator.spriteAnimator.enabled = true; tongueAnimator.PlayUntilFinished("spawn", false, null, -1f, false); float delay = tongueAnimator.CurrentClipLength; float timer = 0f; bool hasPlayedVFX = false; while (timer < delay) { yield return(null); timer += BraveTime.DeltaTime; if (!hasPlayedVFX && delay - timer < 0.1f) { hasPlayedVFX = true; if (WallDisappearVFX) { Vector2 zero = Vector2.zero; Vector2 zero2 = Vector2.zero; DungeonData.Direction facingDirection = m_facingDirection; if (facingDirection != DungeonData.Direction.SOUTH) { if (facingDirection != DungeonData.Direction.EAST) { if (facingDirection == DungeonData.Direction.WEST) { zero = new Vector2(0f, -1f); zero2 = new Vector2(0f, 1f); } } else { zero = new Vector2(0f, -1f); zero2 = new Vector2(0f, 1f); } } else { zero = new Vector2(0f, -1f); zero2 = new Vector2(0f, 1f); } Vector2 min = Vector2.Min(pos1.ToVector2(), pos2.ToVector2()) + zero; Vector2 max = Vector2.Max(pos1.ToVector2(), pos2.ToVector2()) + new Vector2(1f, 1f) + zero2; for (int i = 0; i < 5; i++) { Vector2 v = BraveUtility.RandomVector2(min, max, new Vector2(0.25f, 0.25f)) + new Vector2(0f, 1f); GameObject gameObject = SpawnManager.SpawnVFX(WallDisappearVFX, v, Quaternion.identity); tk2dBaseSprite tk2dBaseSprite = (!gameObject) ? null : gameObject.GetComponent <tk2dBaseSprite>(); if (tk2dBaseSprite) { tk2dBaseSprite.HeightOffGround = 8f; tk2dBaseSprite.UpdateZDepth(); } } } } } if (!m_failedWallConfigure && m_GlitchModeActive) { if (aiActor.ParentRoom != null && GlitchEnemyList != null && GlitchEnemyList.Count > 0 && UnityEngine.Random.value <= m_spawnGitchEnemyOdds) { 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 RandomColorIntensityFloat = UnityEngine.Random.Range(0.1f, 0.25f); int count2 = this.specRigidbody.PixelColliders.Count; this.specRigidbody.PixelColliders.RemoveAt(count2 - 1); this.specRigidbody.PixelColliders.RemoveAt(count2 - 2); StaticReferenceManager.AllShadowSystemDepthHavers.Remove(m_fakeWall.transform); Destroy(m_fakeWall); Destroy(m_fakeCeiling); Vector3 targetPosForSpawn = m_startingPos + DungeonData.GetIntVector2FromDirection(m_facingDirection).ToVector3(); while (timer < delay) { aiAnimator.LockFacingDirection = true; aiAnimator.FacingDirection = DungeonData.GetAngleFromDirection(m_facingDirection); yield return(null); timer += BraveTime.DeltaTime; transform.position = Vector3.Lerp(m_startingPos, targetPosForSpawn, Mathf.InverseLerp(0.42f, 0.58f, timer)); this.specRigidbody.Reinitialize(); } yield return(null); Vector3 FinalSpawnLocation = transform.position; Vector3 VFXExplosionLocation = transform.position; Vector2 VFXExplosionSource = Vector2.zero; DungeonData.Direction CurrentDirection = m_facingDirection; if (CurrentDirection == DungeonData.Direction.WEST) { FinalSpawnLocation += new Vector3(2.5f, 3.5f); VFXExplosionLocation += new Vector3(3.5f, 3.5f); VFXExplosionSource = new Vector2(1, 0); } else if (CurrentDirection == DungeonData.Direction.EAST) { FinalSpawnLocation += new Vector3(4f, 3.5f); VFXExplosionLocation += new Vector3(3f, 3.5f); } else if (CurrentDirection == DungeonData.Direction.NORTH) { FinalSpawnLocation += new Vector3(3.5f, 4f); VFXExplosionLocation += new Vector3(3.5f, 3f); VFXExplosionSource = new Vector2(0, 1); } else if (CurrentDirection == DungeonData.Direction.SOUTH) { FinalSpawnLocation += new Vector3(3.5f, 1.5f); VFXExplosionLocation += new Vector3(3.5f, 2.5f); } yield return(null); string SelectedEnemy = BraveUtility.RandomElement(GlitchEnemyList); ExplosionData wallMimicExplosionData = new ExplosionData(); wallMimicExplosionData.CopyFrom(GameManager.Instance.Dungeon.sharedSettingsPrefab.DefaultExplosionData); wallMimicExplosionData.damage = 0f; wallMimicExplosionData.force /= 1.6f; if (SelectedEnemy != "RATCORPSE") { Exploder.Explode(VFXExplosionLocation, wallMimicExplosionData, VFXExplosionSource, ignoreQueues: true, damageTypes: CoreDamageTypes.None); GameObject SpawnVFXObject = Instantiate((GameObject)ResourceCache.Acquire("Global VFX/VFX_Item_Spawn_Poof")); tk2dBaseSprite SpawnVFXObjectComponent = SpawnVFXObject.GetComponent <tk2dBaseSprite>(); SpawnVFXObjectComponent.PlaceAtPositionByAnchor(FinalSpawnLocation + new Vector3(0f, 0.5f, 0f), tk2dBaseSprite.Anchor.MiddleCenter); SpawnVFXObjectComponent.HeightOffGround = 1f; SpawnVFXObjectComponent.UpdateZDepth(); AIActor glitchActor = AIActor.Spawn(EnemyDatabase.GetOrLoadByGuid(SelectedEnemy), FinalSpawnLocation, aiActor.ParentRoom, true, AIActor.AwakenAnimationType.Awaken, true); /*if (aiActor.ParentRoom != null && !aiActor.ParentRoom.IsSealed && !glitchActor.IgnoreForRoomClear) { * if (GameManager.Instance.PrimaryPlayer.CurrentRoom == aiActor.ParentRoom && aiActor.ParentRoom.EverHadEnemies) { * aiActor.ParentRoom.SealRoom(); * } * }*/ PickupObject.ItemQuality targetGlitchEnemyItemQuality = (UnityEngine.Random.value >= 0.2f) ? ((!BraveUtility.RandomBool()) ? PickupObject.ItemQuality.C : PickupObject.ItemQuality.D) : PickupObject.ItemQuality.B; GenericLootTable glitchEnemyLootTable = (!BraveUtility.RandomBool()) ? GameManager.Instance.RewardManager.GunsLootTable : GameManager.Instance.RewardManager.ItemsLootTable; PickupObject glitchEnemyItem = LootEngine.GetItemOfTypeAndQuality <PickupObject>(targetGlitchEnemyItemQuality, glitchEnemyLootTable, false); /*if (BraveUtility.RandomBool()) { * ChaosUtility.MakeCompanion(glitchActor); * } else { * ChaosShaders.Instance.ApplyGlitchShader(glitchActor, glitchActor.sprite, true, RandomIntervalFloat, RandomDispFloat, RandomDispIntensityFloat, RandomColorProbFloat, RandomColorIntensityFloat); * }*/ ChaosShaders.Instance.ApplyGlitchShader(glitchActor, glitchActor.sprite, true, RandomIntervalFloat, RandomDispFloat, RandomDispIntensityFloat, RandomColorProbFloat, RandomColorIntensityFloat); if (glitchEnemyItem) { glitchActor.AdditionalSafeItemDrops.Add(glitchEnemyItem); } } else { Exploder.Explode(VFXExplosionLocation, wallMimicExplosionData, VFXExplosionSource, ignoreQueues: true, damageTypes: CoreDamageTypes.None); GameObject SpawnVFXObject = Instantiate((GameObject)ResourceCache.Acquire("Global VFX/VFX_Item_Spawn_Poof")); tk2dBaseSprite SpawnVFXObjectComponent = SpawnVFXObject.GetComponent <tk2dBaseSprite>(); SpawnVFXObjectComponent.PlaceAtPositionByAnchor(FinalSpawnLocation + new Vector3(0f, 0.5f, 0f), tk2dBaseSprite.Anchor.MiddleCenter); SpawnVFXObjectComponent.HeightOffGround = 1f; SpawnVFXObjectComponent.UpdateZDepth(); GameObject spawnedRatCorpseObject = Instantiate(ChaosPrefabs.RatCorpseNPC, FinalSpawnLocation, Quaternion.identity); TalkDoerLite talkdoerComponent = spawnedRatCorpseObject.GetComponent <TalkDoerLite>(); talkdoerComponent.transform.position.XY().GetAbsoluteRoom().RegisterInteractable(talkdoerComponent); talkdoerComponent.transform.position.XY().GetAbsoluteRoom().TransferInteractableOwnershipToDungeon(talkdoerComponent); talkdoerComponent.playmakerFsm.SetState("Set Mode"); ChaosUtility.AddHealthHaver(talkdoerComponent.gameObject, 60, flashesOnDamage: false, exploderSpawnsItem: true); } yield return(null); Destroy(aiActor.gameObject); yield break; } } PickupObject.ItemQuality targetQuality = (UnityEngine.Random.value >= 0.2f) ? ((!BraveUtility.RandomBool()) ? PickupObject.ItemQuality.C : PickupObject.ItemQuality.D) : PickupObject.ItemQuality.B; GenericLootTable lootTable = (!BraveUtility.RandomBool()) ? GameManager.Instance.RewardManager.GunsLootTable : GameManager.Instance.RewardManager.ItemsLootTable; PickupObject item = LootEngine.GetItemOfTypeAndQuality <PickupObject>(targetQuality, lootTable, false); if (item) { if (m_ChaosModeActive) { if (UnityEngine.Random.value <= m_ItemDropOdds) { aiActor.AdditionalSafeItemDrops.Add(item); } else { aiActor.AdditionalSafeItemDrops.Add(PickupObjectDatabase.GetById(70)); if (BraveUtility.RandomBool()) { aiActor.AdditionalSafeItemDrops.Add(PickupObjectDatabase.GetById(70)); } if (m_GlitchModeActive) { aiActor.AdditionalSafeItemDrops.Add(PickupObjectDatabase.GetById(70)); } } if (UnityEngine.Random.value <= m_FriendlyMimicOdds) { m_isFriendlyMimic = true; } } else { aiActor.AdditionalSafeItemDrops.Add(item); } } else { if (m_ChaosModeActive && UnityEngine.Random.value <= m_FriendlyMimicOdds) { m_isFriendlyMimic = true; } } aiActor.enabled = true; behaviorSpeculator.enabled = true; if (aiActor.ParentRoom != null && aiActor.ParentRoom.IsSealed && !m_isFriendlyMimic) { aiActor.IgnoreForRoomClear = false; } // if (m_isFriendlyMimic) { ChaosUtility.MakeCompanion(aiActor); } if (m_isFriendlyMimic) { aiActor.ApplyEffect(GameManager.Instance.Dungeon.sharedSettingsPrefab.DefaultPermanentCharmEffect, 1f, null); } if (!m_failedWallConfigure) { int count = this.specRigidbody.PixelColliders.Count; for (int j = 0; j < count - 2; j++) { this.specRigidbody.PixelColliders[j].Enabled = true; } this.specRigidbody.PixelColliders.RemoveAt(count - 1); this.specRigidbody.PixelColliders.RemoveAt(count - 2); StaticReferenceManager.AllShadowSystemDepthHavers.Remove(m_fakeWall.transform); Destroy(m_fakeWall); Destroy(m_fakeCeiling); } else { int count = this.specRigidbody.PixelColliders.Count; for (int j = 0; j < count; j++) { this.specRigidbody.PixelColliders[j].Enabled = true; } } for (int k = 0; k < m_hands.Length; k++) { m_hands[k].gameObject.SetActive(true); } aiActor.ToggleRenderers(true); if (aiShooter) { aiShooter.ToggleGunAndHandRenderers(true, "ChaosWallMimicController"); } aiActor.IsGone = false; healthHaver.IsVulnerable = true; aiActor.State = AIActor.ActorState.Normal; for (int l = 0; l < m_hands.Length; l++) { m_hands[l].gameObject.SetActive(false); } m_isFinished = true; delay = 0.58f; timer = 0f; Vector3 targetPos = m_startingPos + DungeonData.GetIntVector2FromDirection(m_facingDirection).ToVector3(); while (timer < delay) { aiAnimator.LockFacingDirection = true; aiAnimator.FacingDirection = DungeonData.GetAngleFromDirection(m_facingDirection); yield return(null); timer += BraveTime.DeltaTime; transform.position = Vector3.Lerp(m_startingPos, targetPos, Mathf.InverseLerp(0.42f, 0.58f, timer)); this.specRigidbody.Reinitialize(); } aiAnimator.LockFacingDirection = false; knockbackDoer.SetImmobile(false, "ChaosWallMimicController"); aiActor.CollisionDamage = 0.5f; aiActor.CollisionKnockbackStrength = m_collisionKnockbackStrength; yield break; }
private IEnumerator HandleExplosion(Vector3 position, ExplosionData data, Vector2 sourceNormal, Action onExplosionBegin, bool ignoreQueues, CoreDamageTypes damageTypes, bool ignoreDamageCaps) { if (data.usesComprehensiveDelay) { yield return(new WaitForSeconds(data.comprehensiveDelay)); } Exploder.OnExplosionTriggered?.Invoke(); bool addFireGoop = (damageTypes | CoreDamageTypes.Fire) == damageTypes; bool addFreezeGoop = (damageTypes | CoreDamageTypes.Ice) == damageTypes; bool addPoisonGoop = (damageTypes | CoreDamageTypes.Poison) == damageTypes; bool isFreezeExplosion = data.isFreezeExplosion; if (!data.isFreezeExplosion && addFreezeGoop) { isFreezeExplosion = true; data.freezeRadius = data.damageRadius; data.freezeEffect = GameManager.Instance.Dungeon.sharedSettingsPrefab.DefaultFreezeExplosionEffect; } // Be sure to use a clone of ExplosionManager for this else explosion queueing breaks! // // (it won't let you use ExplosionManager's original code on a new Exploder class normally. ;) - [Apache Thunder] // if (!ignoreQueues) { ChaosExplosionManager.Instance.Queue(this); while (!ChaosExplosionManager.Instance.IsExploderReady(this)) { yield return(null); } ChaosExplosionManager.Instance.Dequeue(); if (ChaosExplosionManager.Instance.QueueCount == 0) { ChaosExplosionManager.Instance.StartCoroutine(HandleCurrentExplosionNotification(0.5f)); } } onExplosionBegin?.Invoke(); float damageRadius = data.GetDefinedDamageRadius(); float pushSqrRadius = data.pushRadius * data.pushRadius; float bulletDeletionSqrRadius = damageRadius * damageRadius; if (addFreezeGoop) { DeadlyDeadlyGoopManager.GetGoopManagerForGoopType(GameManager.Instance.Dungeon.sharedSettingsPrefab.DefaultFreezeGoop).TimedAddGoopCircle(position.XY(), damageRadius, 0.5f, false); DeadlyDeadlyGoopManager.FreezeGoopsCircle(position.XY(), damageRadius); } if (addFireGoop) { DeadlyDeadlyGoopManager.GetGoopManagerForGoopType(GameManager.Instance.Dungeon.sharedSettingsPrefab.DefaultFireGoop).TimedAddGoopCircle(position.XY(), damageRadius, 0.5f, false); } if (addPoisonGoop) { DeadlyDeadlyGoopManager.GetGoopManagerForGoopType(GameManager.Instance.Dungeon.sharedSettingsPrefab.DefaultPoisonGoop).TimedAddGoopCircle(position.XY(), damageRadius, 0.5f, false); } if (!isFreezeExplosion) { DeadlyDeadlyGoopManager.IgniteGoopsCircle(position.XY(), damageRadius); } if (data.effect) { GameObject gameObject; if (data.effect.GetComponent <ParticleSystem>() != null || data.effect.GetComponentInChildren <ParticleSystem>() != null) { gameObject = SpawnManager.SpawnVFX(data.effect, position, Quaternion.identity); } else { gameObject = SpawnManager.SpawnVFX(data.effect, position, Quaternion.identity); } if (data.rotateEffectToNormal && gameObject) { gameObject.transform.rotation = Quaternion.Euler(0f, 0f, sourceNormal.ToAngle()); } tk2dBaseSprite component = gameObject.GetComponent <tk2dBaseSprite>(); if (component) { component.HeightOffGround += UnityEngine.Random.Range(-0.1f, 0.2f); component.UpdateZDepth(); } ExplosionDebrisLauncher[] componentsInChildren = gameObject.GetComponentsInChildren <ExplosionDebrisLauncher>(); Vector3 position2 = gameObject.transform.position.WithZ(gameObject.transform.position.y); GameObject gameObject2 = new GameObject("SoundSource"); gameObject2.transform.position = position2; if (data.playDefaultSFX) { AkSoundEngine.PostEvent("Play_WPN_grenade_blast_01", gameObject2); } Destroy(gameObject2, 5f); for (int i = 0; i < componentsInChildren.Length; i++) { if (componentsInChildren[i]) { if (sourceNormal == Vector2.zero) { componentsInChildren[i].Launch(); } else { componentsInChildren[i].Launch(sourceNormal); } } } if (gameObject) { Transform transform = gameObject.transform.Find("scorch"); if (transform) { transform.gameObject.SetLayerRecursively(LayerMask.NameToLayer("BG_Critical")); } } if (data.doExplosionRing) { } } yield return(new WaitForSeconds(data.explosionDelay)); List <HealthHaver> allHealth = StaticReferenceManager.AllHealthHavers; if (allHealth != null && (data.doDamage || data.doForce)) { for (int j = 0; j < allHealth.Count; j++) { HealthHaver healthHaver = allHealth[j]; if (healthHaver) { if (healthHaver && healthHaver.aiActor) { if (!healthHaver.aiActor.HasBeenEngaged) { goto IL_A82; } if (healthHaver.aiActor.CompanionOwner && data.damageToPlayer == 0f) { goto IL_A82; } } if (!data.ignoreList.Contains(healthHaver.specRigidbody)) { if (position.GetAbsoluteRoom() == allHealth[j].transform.position.GetAbsoluteRoom()) { for (int k = 0; k < healthHaver.NumBodyRigidbodies; k++) { SpeculativeRigidbody bodyRigidbody = healthHaver.GetBodyRigidbody(k); PlayerController playerController = (!bodyRigidbody) ? null : (bodyRigidbody.gameActor as PlayerController); Vector2 a = healthHaver.transform.position.XY(); Vector2 vector = a - position.XY(); bool flag = false; float num; if (bodyRigidbody.HitboxPixelCollider != null) { a = bodyRigidbody.HitboxPixelCollider.UnitCenter; vector = a - position.XY(); num = BraveMathCollege.DistToRectangle(position.XY(), bodyRigidbody.HitboxPixelCollider.UnitBottomLeft, bodyRigidbody.HitboxPixelCollider.UnitDimensions); } else { a = healthHaver.transform.position.XY(); vector = a - position.XY(); num = vector.magnitude; } if (!playerController || ((!data.doDamage || num >= damageRadius) && (!isFreezeExplosion || num >= data.freezeRadius) && (!data.doForce || num >= data.pushRadius)) || !IsPlayerBlockedByWall(playerController, position)) { if (playerController) { if (!bodyRigidbody.CollideWithOthers) { goto IL_A6E; } if (playerController.DodgeRollIsBlink && playerController.IsDodgeRolling) { goto IL_A6E; } } if (data.doDamage && num < damageRadius) { if (playerController) { bool flag2 = true; if (PassiveItem.ActiveFlagItems.ContainsKey(playerController) && PassiveItem.ActiveFlagItems[playerController].ContainsKey(typeof(HelmetItem)) && num > damageRadius * HelmetItem.EXPLOSION_RADIUS_MULTIPLIER) { flag2 = false; } if (flag2 && !playerController.IsEthereal) { HealthHaver healthHaver2 = healthHaver; float damage = data.damageToPlayer; Vector2 direction = vector; string enemiesString = StringTableManager.GetEnemiesString("#EXPLOSION", -1); CoreDamageTypes damageTypes2 = CoreDamageTypes.None; DamageCategory damageCategory = DamageCategory.Normal; healthHaver2.ApplyDamage(damage, direction, enemiesString, damageTypes2, damageCategory, false, null, ignoreDamageCaps); } } else { HealthHaver healthHaver3 = healthHaver; float damage = data.damage; Vector2 direction = vector; string enemiesString = StringTableManager.GetEnemiesString("#EXPLOSION", -1); CoreDamageTypes damageTypes2 = CoreDamageTypes.None; DamageCategory damageCategory = DamageCategory.Normal; healthHaver3.ApplyDamage(damage, direction, enemiesString, damageTypes2, damageCategory, false, null, ignoreDamageCaps); if (data.IsChandelierExplosion && (!healthHaver || healthHaver.healthHaver.IsDead)) { GameStatsManager.Instance.RegisterStatChange(TrackedStats.ENEMIES_KILLED_WITH_CHANDELIERS, 1f); } } flag = true; } if (isFreezeExplosion && num < data.freezeRadius) { if (healthHaver && healthHaver.gameActor != null && !healthHaver.IsDead && (!healthHaver.aiActor || !healthHaver.aiActor.IsGone)) { healthHaver.gameActor.ApplyEffect(data.freezeEffect, 1f, null); } flag = true; } if (data.doForce && num < data.pushRadius) { KnockbackDoer knockbackDoer = healthHaver.knockbackDoer; if (knockbackDoer) { float num2 = 1f - num / data.pushRadius; if (data.preventPlayerForce && healthHaver.GetComponent <PlayerController>()) { num2 = 0f; } knockbackDoer.ApplyKnockback(vector.normalized, num2 * data.force, false); } flag = true; } if (flag) { break; } } IL_A6E :; } } } } IL_A82 :; } } List <MinorBreakable> allBreakables = StaticReferenceManager.AllMinorBreakables; if (allBreakables != null) { for (int l = 0; l < allBreakables.Count; l++) { MinorBreakable minorBreakable = allBreakables[l]; if (minorBreakable) { if (!minorBreakable.resistsExplosions) { if (!minorBreakable.OnlyBrokenByCode) { Vector2 vector2 = minorBreakable.CenterPoint - position.XY(); if (vector2.sqrMagnitude < pushSqrRadius) { minorBreakable.Break(vector2.normalized); } } } } } } if (data.doDestroyProjectiles) { float duration = 0.2f; PlayerController bestActivePlayer = GameManager.Instance.BestActivePlayer; if (bestActivePlayer && bestActivePlayer.CurrentRoom != null && bestActivePlayer.CurrentRoom.area != null && bestActivePlayer.CurrentRoom.area.PrototypeRoomCategory == PrototypeDungeonRoom.RoomCategory.BOSS) { duration = 0.035f; } GameManager.Instance.Dungeon.StartCoroutine(HandleBulletDeletionFrames(position, bulletDeletionSqrRadius, duration)); } if (data.doDamage || data.breakSecretWalls) { List <MajorBreakable> allMajorBreakables = StaticReferenceManager.AllMajorBreakables; if (allMajorBreakables != null) { for (int m = 0; m < allMajorBreakables.Count; m++) { MajorBreakable majorBreakable = allMajorBreakables[m]; if (majorBreakable) { if (majorBreakable.enabled) { if (!majorBreakable.IgnoreExplosions) { Vector2 sourceDirection = majorBreakable.CenterPoint - position.XY(); if (sourceDirection.sqrMagnitude < pushSqrRadius && (!majorBreakable.IsSecretDoor || !data.forcePreventSecretWallDamage)) { if (data.doDamage) { majorBreakable.ApplyDamage(data.damage, sourceDirection, false, true, false); } if (data.breakSecretWalls && majorBreakable.IsSecretDoor) { StaticReferenceManager.AllMajorBreakables[m].ApplyDamage(1E+10f, Vector2.zero, false, true, true); StaticReferenceManager.AllMajorBreakables[m].ApplyDamage(1E+10f, Vector2.zero, false, true, true); StaticReferenceManager.AllMajorBreakables[m].ApplyDamage(1E+10f, Vector2.zero, false, true, true); } } } } } } } } if (data.doForce) { Exploder.DoRadialPush(position, data.debrisForce, data.pushRadius); } if (data.doScreenShake && GameManager.Instance.MainCameraController != null) { GameManager.Instance.MainCameraController.DoScreenShake(data.ss, new Vector2?(position), false); } if (data.doStickyFriction && GameManager.Instance.MainCameraController != null) { StickyFrictionManager.Instance.RegisterExplosionStickyFriction(); } for (int n = 0; n < StaticReferenceManager.AllRatTrapdoors.Count; n++) { if (StaticReferenceManager.AllRatTrapdoors[n]) { StaticReferenceManager.AllRatTrapdoors[n].OnNearbyExplosion(position); } } Destroy(this.gameObject); yield break; }
protected override void OnPreCollision(SpeculativeRigidbody myRigidbody, PixelCollider myCollider, SpeculativeRigidbody otherRigidbody, PixelCollider otherCollider) { if (otherRigidbody != null && otherRigidbody.aiActor != null && BadGuids.Contains(otherRigidbody.aiActor.EnemyGuid)) { GameManager.Instance.StartCoroutine(this.HandleEnemyDeath(otherRigidbody.aiActor)); } else if (otherRigidbody != null && otherRigidbody.aiActor != null && GoodGuids.Contains(otherRigidbody.aiActor.EnemyGuid)) { tk2dBaseSprite sprite = Instantiate(NotSmiteVFX, otherRigidbody.aiActor.CenterPosition, Quaternion.identity).GetComponent <tk2dBaseSprite>(); sprite.HeightOffGround = 20f; sprite.UpdateZDepth(); string guid = otherRigidbody.aiActor.EnemyGuid; Vector2 pos = otherRigidbody.transform.position; bool isBlackPhantom = otherRigidbody.aiActor.IsBlackPhantom; otherRigidbody.aiActor.EraseFromExistence(true); AIActor orLoadByGuid = EnemyDatabase.GetOrLoadByGuid(guid); GameObject gameObject = Instantiate(orLoadByGuid.gameObject, pos, Quaternion.identity); CompanionController orAddComponent = gameObject.GetOrAddComponent <CompanionController>(); if (isBlackPhantom) { gameObject.GetComponent <AIActor>().BecomeBlackPhantom(); } orAddComponent.companionID = CompanionController.CompanionIdentifier.NONE; orAddComponent.Initialize(this.Owner as PlayerController); orAddComponent.behaviorSpeculator.MovementBehaviors.Add(new CompanionFollowPlayerBehavior()); AIActor aiactor = gameObject.GetComponent <AIActor>(); if (orAddComponent.healthHaver != null) { orAddComponent.healthHaver.PreventAllDamage = true; } if (orAddComponent.bulletBank != null) { orAddComponent.bulletBank.OnProjectileCreated += PokeballItem.CatchProjectileBehaviour.OnPostProcessProjectile; } if (orAddComponent.aiShooter != null) { orAddComponent.aiShooter.PostProcessProjectile += PokeballItem.CatchProjectileBehaviour.OnPostProcessProjectile; } List <Tuple <int, MirrorImageBehavior> > toReplace = new List <Tuple <int, MirrorImageBehavior> >(); Dictionary <int, Dictionary <int, MirrorImageBehavior> > toReplace2 = new Dictionary <int, Dictionary <int, MirrorImageBehavior> >(); int i = 0; ETGModConsole.Log("ADDING..."); foreach (AttackBehaviorBase behav in aiactor.behaviorSpeculator.AttackBehaviors) { ETGModConsole.Log(behav.GetType().ToString()); if (behav is MirrorImageBehavior) { toReplace.Add(new Tuple <int, MirrorImageBehavior>(i, behav as MirrorImageBehavior)); ETGModConsole.Log("ADDED A MIRRORIMAGEBEHAVIOUR WITH AN INDEX " + i); } else if (behav is AttackBehaviorGroup) { Dictionary <int, MirrorImageBehavior> list = new Dictionary <int, MirrorImageBehavior>(); int j = 0; foreach (AttackBehaviorGroup.AttackGroupItem item in (behav as AttackBehaviorGroup).AttackBehaviors) { if (item.Behavior is MirrorImageBehavior) { list.Add(j, item.Behavior as MirrorImageBehavior); } j++; } toReplace2.Add(i, list); ETGModConsole.Log("ADDED SOMETHING COMPLEX WITH AN INDEX " + i); } i++; } ETGModConsole.Log("REPLACING..."); foreach (Tuple <int, MirrorImageBehavior> tuple in toReplace) { aiactor.behaviorSpeculator.AttackBehaviors[tuple.First] = new FriendlyMirrorImageBehavior { NumImages = tuple.Second.NumImages, MaxImages = tuple.Second.MaxImages, MirrorHealth = tuple.Second.MirrorHealth, SpawnDelay = tuple.Second.SpawnDelay, SplitDelay = tuple.Second.SplitDelay, SplitDistance = tuple.Second.SplitDistance, Anim = tuple.Second.Anim, AnimRequiresTransparency = tuple.Second.AnimRequiresTransparency, MirrorDeathAnim = tuple.Second.MirrorDeathAnim, MirroredAnims = tuple.Second.MirroredAnims, AccumulateHealthThresholds = tuple.Second.AccumulateHealthThresholds, AttackCooldown = tuple.Second.AttackCooldown, Cooldown = tuple.Second.Cooldown, CooldownVariance = tuple.Second.CooldownVariance, GlobalCooldown = tuple.Second.GlobalCooldown, GroupCooldown = tuple.Second.GroupCooldown, GroupName = tuple.Second.GroupName, HealthThresholds = tuple.Second.HealthThresholds, InitialCooldown = tuple.Second.InitialCooldown, InitialCooldownVariance = tuple.Second.InitialCooldownVariance, IsBlackPhantom = tuple.Second.IsBlackPhantom, MaxEnemiesInRoom = tuple.Second.MaxEnemiesInRoom, MaxHealthThreshold = tuple.Second.MaxHealthThreshold, MaxUsages = tuple.Second.MaxUsages, MinHealthThreshold = tuple.Second.MinHealthThreshold, MinRange = tuple.Second.MinRange, MinWallDistance = tuple.Second.MinWallDistance, Range = tuple.Second.Range, RequiresLineOfSight = tuple.Second.RequiresLineOfSight, resetCooldownOnDamage = tuple.Second.resetCooldownOnDamage, targetAreaStyle = tuple.Second.targetAreaStyle }; ETGModConsole.Log("REPLACED ATTACK BEHAVIOUR #" + tuple.First + " WITH A FRIENDLYMIRRORIMAGEBEHAVIOUR."); } foreach (KeyValuePair <int, Dictionary <int, MirrorImageBehavior> > valuePair in toReplace2) { foreach (KeyValuePair <int, MirrorImageBehavior> valuePair2 in valuePair.Value) { (aiactor.behaviorSpeculator.AttackBehaviors[valuePair.Key] as AttackBehaviorGroup).AttackBehaviors[valuePair2.Key].Behavior = new FriendlyMirrorImageBehavior { NumImages = valuePair2.Value.NumImages, MaxImages = valuePair2.Value.MaxImages, MirrorHealth = valuePair2.Value.MirrorHealth, SpawnDelay = valuePair2.Value.SpawnDelay, SplitDelay = valuePair2.Value.SplitDelay, SplitDistance = valuePair2.Value.SplitDistance, Anim = valuePair2.Value.Anim, AnimRequiresTransparency = valuePair2.Value.AnimRequiresTransparency, MirrorDeathAnim = valuePair2.Value.MirrorDeathAnim, MirroredAnims = valuePair2.Value.MirroredAnims, AccumulateHealthThresholds = valuePair2.Value.AccumulateHealthThresholds, AttackCooldown = valuePair2.Value.AttackCooldown, Cooldown = valuePair2.Value.Cooldown, CooldownVariance = valuePair2.Value.CooldownVariance, GlobalCooldown = valuePair2.Value.GlobalCooldown, GroupCooldown = valuePair2.Value.GroupCooldown, GroupName = valuePair2.Value.GroupName, HealthThresholds = valuePair2.Value.HealthThresholds, InitialCooldown = valuePair2.Value.InitialCooldown, InitialCooldownVariance = valuePair2.Value.InitialCooldownVariance, IsBlackPhantom = valuePair2.Value.IsBlackPhantom, MaxEnemiesInRoom = valuePair2.Value.MaxEnemiesInRoom, MaxHealthThreshold = valuePair2.Value.MaxHealthThreshold, MaxUsages = valuePair2.Value.MaxUsages, MinHealthThreshold = valuePair2.Value.MinHealthThreshold, MinRange = valuePair2.Value.MinRange, MinWallDistance = valuePair2.Value.MinWallDistance, Range = valuePair2.Value.Range, RequiresLineOfSight = valuePair2.Value.RequiresLineOfSight, resetCooldownOnDamage = valuePair2.Value.resetCooldownOnDamage, targetAreaStyle = valuePair2.Value.targetAreaStyle }; } } AdditionalCompanionOwner additionalCompanionOwner = this.Owner.gameObject.AddComponent <AdditionalCompanionOwner>(); additionalCompanionOwner.CompanionGuid = guid; additionalCompanionOwner.IsBlackPhantom = isBlackPhantom; PhysicsEngine.SkipCollision = true; return; } base.OnPreCollision(myRigidbody, myCollider, otherRigidbody, otherCollider); }
private IEnumerator Jump(Vector2 direction) { m_isJumping = true; if (player.CurrentFireMeterValue > 0f) { player.CurrentFireMeterValue = Mathf.Max(0f, player.CurrentFireMeterValue -= 0.5f); if (player.CurrentFireMeterValue == 0f) { player.IsOnFire = false; } } Func <bool, bool> noFallsForYou = ((bool b) => false); AnimationCurve jumpCurve = new AnimationCurve(new Keyframe[] { new Keyframe { time = 0, value = 6f }, new Keyframe { time = (0.5f * player.rollStats.GetModifiedTime(player)), value = 0f }, new Keyframe { time = player.rollStats.GetModifiedTime(player), value = -6f } }); player.SetInputOverride("king slime's jump"); player.ToggleGunRenderers(false, "king slime's jump"); player.ToggleHandRenderers(false, "king slime's jump"); player.OnAboutToFall += noFallsForYou; player.specRigidbody.AddCollisionLayerIgnoreOverride(CollisionMask.LayerToMask(CollisionLayer.Projectile)); player.specRigidbody.AddCollisionLayerIgnoreOverride(CollisionMask.LayerToMask(CollisionLayer.EnemyHitBox)); player.specRigidbody.AddCollisionLayerIgnoreOverride(CollisionMask.LayerToMask(CollisionLayer.EnemyCollider)); float ela = 0f; while (ela < (player.rollStats.GetModifiedTime(player))) { ela = BraveTime.DeltaTime + ela; player.sprite.transform.position = new Vector2(player.sprite.transform.position.x, Mathf.Max(player.sprite.transform.position.y + (jumpCurve.Evaluate(ela) * BraveTime.DeltaTime), player.ShadowObject.GetAnyComponent <tk2dBaseSprite>().WorldCenter.y)); float time = Mathf.Clamp01((ela - BraveTime.DeltaTime) / player.rollStats.GetModifiedTime(player)); float time2 = Mathf.Clamp01(ela / player.rollStats.GetModifiedTime(player)); float num = (Mathf.Clamp01(player.rollStats.speed.Evaluate(time2)) - Mathf.Clamp01(player.rollStats.speed.Evaluate(time))) * player.rollStats.GetModifiedDistance(player); player.specRigidbody.Velocity = direction.normalized * (num / BraveTime.DeltaTime) + player.knockbackComponent + player.immutableKnockbackComponent; yield return(null); } player.specRigidbody.Velocity = Vector2.zero; player.specRigidbody.RemoveCollisionLayerIgnoreOverride(CollisionMask.LayerToMask(CollisionLayer.Projectile)); player.specRigidbody.RemoveCollisionLayerIgnoreOverride(CollisionMask.LayerToMask(CollisionLayer.EnemyHitBox)); player.specRigidbody.RemoveCollisionLayerIgnoreOverride(CollisionMask.LayerToMask(CollisionLayer.EnemyCollider)); player.OnAboutToFall -= noFallsForYou; player.ToggleGunRenderers(true, "king slime's jump"); player.ToggleHandRenderers(true, "king slime's jump"); player.ClearInputOverride("king slime's jump"); Exploder.DoRadialPush(player.sprite.WorldBottomCenter.ToVector3ZUp(player.sprite.WorldBottomCenter.y), 22f, 1.5f); Exploder.DoRadialKnockback(player.sprite.WorldBottomCenter.ToVector3ZUp(player.sprite.WorldBottomCenter.y), 100f, 1.5f); Exploder.DoRadialDamage(5f * player.stats.GetStatValue(PlayerStats.StatType.DodgeRollDamage), player.sprite.WorldBottomCenter.ToVector3ZUp(player.sprite.WorldBottomCenter.y), 1.5f, false, true, false, null); GameObject gameObject = SpawnManager.SpawnVFX(BraveResources.Load <GameObject>("Global VFX/VFX_DBZ_Charge", ".prefab"), false); gameObject.transform.position = player.specRigidbody.UnitCenter; tk2dBaseSprite component = gameObject.GetComponent <tk2dBaseSprite>(); component.HeightOffGround = -1f; component.UpdateZDepth(); m_isJumping = false; yield break; }