public override void OnHit(HitInfo info, HitResult hitResult) { if (hitResult != HitResult.Invalid) { FSMUtility.SendEventToGameObject(info.Attacker, "DEALT DAMAGE", false); } }
private void Start() { gameObject.transform.position = new Vector3(0f, 2.77f, -20f); // Dunno why, but it's in the FSM and seems to work. May work without but w/e. PlayMakerFSM.BroadcastEvent("CHARM MSG"); FSMUtility.SendEventToGameObject(gameObject, "UP", true); StartCoroutine(WaitForTimeout()); }
private void Close() { if (_ableToClose) { _ableToClose = false; PlayMakerFSM.BroadcastEvent("CHARM MSG DOWN"); FSMUtility.SendEventToGameObject(gameObject, "DOWN", true); Destroy(gameObject, 0.25f); } }
// Taken and modified from https://github.com/5FiftySix6/HollowKnight.Lost-Lord/blob/master/LostLord/Kin.cs private void ReceiveHit(On.InfectedEnemyEffects.orig_RecieveHitEffect orig, InfectedEnemyEffects self, float attack_direction) { if (self.GetAttr <bool>("didFireThisFrame")) { return; } if (self.GetAttr <SpriteFlash>("spriteFlash") != null) { self.GetAttr <SpriteFlash>("spriteFlash").flashFocusHeal(); } FSMUtility.SendEventToGameObject(gameObject, "DAMAGE FLASH", true); self.GetAttr <AudioEvent>("impactAudio").SpawnAndPlayOneShot(self.GetAttr <AudioSource>("audioSourcePrefab"), self.transform.position); self.SetAttr("didFireThisFrame", true); }
public static GameObject ShowAdditive(BigItemDef[] items, GameObject fsmObj = null, string eventName = null) { int count = items.Count(item => RandomizerMod.Instance.Settings.GetBool(false, item.Name)); if (count < items.Length) { return(Show(items[count], fsmObj, eventName)); } // In case of failure to give item, prevent soft lock if (fsmObj != null && eventName != null) { FSMUtility.SendEventToGameObject(fsmObj, eventName); } return(null); }
public static GameObject ShowAdditive(BigItemDef[] items, GameObject fsmObj = null, string eventName = null) { for (int i = 0; i < items.Length; i++) { if (!Ref.PD.GetBool(items[i].BoolName)) { return(Show(items[i], fsmObj, eventName)); } } // In case of failure to give item, prevent soft lock if (fsmObj != null && eventName != null) { FSMUtility.SendEventToGameObject(fsmObj, eventName); } return(null); }
// This function does damage to the enemy using the damage numbers given by the weapon type public static void HitEnemy(HealthManager targetHP, int expectedDamage, HitInstance hitInstance, int soulGain) { int realDamage = expectedDamage; //TODO: this specifics might add up later, Moss Charger is just one of the few except and there maybe many more int cardinalDirection = DirectionUtils.GetCardinalDirection(hitInstance.GetActualDirection(targetHP.transform)); GameObject blockHitPrefab = targetHP.GetAttr <GameObject>("blockHitPrefab"); bool specialEnemy = (targetHP.name.Contains("Charger")); if (targetHP.IsBlockingByDirection(cardinalDirection, AttackTypes.Nail) && !specialEnemy || realDamage <= 0) { FSMUtility.SendEventToGameObject(targetHP.gameObject, "BLOCKED HIT", false); GameObject blockHit = blockHitPrefab.Spawn(); blockHit.transform.position = targetHP.transform.position; blockHit.transform.Rotate(new Vector3(0, 0, 90 * cardinalDirection)); return; } //bool specialEnemy = (targetHP.name.Contains("Moss Charger") || targetHP.name.Contains("Mushroom Brawler")); //if (targetHP.IsInvincible && !specialEnemy && !PlayerData.instance.equippedCharm_25) //{ // GameObject blockHit = blockHitPrefab.Spawn(); // blockHit.transform.position = targetHP.transform.position; // return; //} if (targetHP.gameObject.name.Contains("Blocker")) { realDamage = realDamage * 4; } Recoil recoil = targetHP.gameObject.GetComponent <Recoil>(); if (recoil != null && PlayerData.instance.equippedCharm_15) { recoil.RecoilByDirection(cardinalDirection, 0.8f); } if (realDamage <= 0) { return; } if (targetHP == null) { return; } /* * Play animations and such... * Mostly code copied from the healthmanager class itself. */ //Modding.Logger.Log("Cardinal is " + cardinalDirection); FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false); GameObject sendHitGO = targetHP.GetAttr <GameObject>("sendHitGO"); if (sendHitGO != null) { FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false); } GameObject HitPrefab = targetHP.GetAttr <GameObject>("strikeNailPrefab"); GameObject ImpactPrefab = targetHP.GetAttr <GameObject>("slashImpactPrefab"); Vector3? effectOrigin = targetHP.GetAttr <Vector3?>("effectOrigin"); if (HitPrefab != null && effectOrigin != null) { HitPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f); } if (ImpactPrefab != null && effectOrigin != null) { ImpactPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f); } FSMUtility.SendEventToGameObject(targetHP.gameObject, "TOOK DAMAGE", false); FSMUtility.SendEventToGameObject(targetHP.gameObject, "TAKE DAMAGE", false); FSMUtility.SendEventToGameObject(hitInstance.Source, "HIT LANDED", false); FSMUtility.SendEventToGameObject(hitInstance.Source, "DEALT DAMAGE", false); // Actually do damage to target. try { //TODO: change this audio source //HeroController.instance.spellControl.gameObject.GetComponent<AudioSource>().PlayOneShot(LoadAssets.enemyHurtSFX[soundRandom.Next(0, 2)]); LoadAssets.sfxDictionary.TryGetValue("enemyhurt" + soundRandom.Next(1, 4) + ".wav", out AudioClip ac); HeroController.instance.spellControl.gameObject.GetComponent <AudioSource>().PlayOneShot(ac); } catch (Exception e) { Modding.Logger.Log("Enemy Hurt Exception Thrown " + e); } if (targetHP.damageOverride) { targetHP.hp -= 1; } else { targetHP.hp -= realDamage; // the actual damage HeroController.instance.AddMPCharge(soulGain); } // Trigger Kill animation if (targetHP.hp <= 0f) { LoadAssets.sfxDictionary.TryGetValue("enemydead" + soundRandom.Next(1, 4) + ".wav", out AudioClip ac); HeroController.instance.spellControl.gameObject.GetComponent <AudioSource>().PlayOneShot(ac); targetHP.Die(cardinalDirection * 90, AttackTypes.Spell, true); HeroController.instance.AddMPCharge(3); return; } bool? hasAlternateHitAnimation = targetHP.GetAttr <bool?>("hasAlternateHitAnimation"); string alternateHitAnimation = targetHP.GetAttr <string>("alternateHitAnimation"); if (hasAlternateHitAnimation != null && (bool)hasAlternateHitAnimation && targetHP.GetComponent <tk2dSpriteAnimator>() && alternateHitAnimation != null) { targetHP.GetComponent <tk2dSpriteAnimator>().Play(alternateHitAnimation); } PlayMakerFSM stunControlFSM = targetHP.gameObject.GetComponents <PlayMakerFSM>().FirstOrDefault(component => component.FsmName == "Stun Control" || component.FsmName == "Stun"); if (stunControlFSM != null) { //stunControlFSM.SendEvent("STUN DAMAGE"); } /* * Uncomment below for a sick looking enter the gungeon style freeze frame or for camera shake. */ //GameManager.instance.FreezeMoment(1); //GameCameras.instance.cameraShakeFSM.SendEvent("EnemyKillShake"); SpriteFlash f = targetHP.gameObject.GetComponent <SpriteFlash>(); if (f != null) { f.flashInfected(); } }
private IEnumerator ShowPopup() { // Check for skipping popup Coroutine skipCoroutine = StartCoroutine(LookForShowInstantly()); // Begin dimming the scene GameObject dimmer = CanvasUtil.CreateImagePanel(gameObject, BlackPixel, new CanvasUtil.RectData(Vector2.zero, Vector2.zero, Vector2.zero, Vector2.one)); dimmer.GetComponent <Image>().preserveAspect = false; CanvasGroup dimmerCG = dimmer.AddComponent <CanvasGroup>(); dimmerCG.blocksRaycasts = false; dimmerCG.interactable = false; dimmerCG.alpha = 0; StartCoroutine(FadeInCanvasGroup(dimmerCG)); yield return(WaitForSeconds(0.1f)); // Aim for 400 high prompt image float scaler = _imagePrompt.texture.height / 400f; Vector2 size = new Vector2(_imagePrompt.texture.width / scaler, _imagePrompt.texture.height / scaler); // Begin fading in the top bits of the popup GameObject topImage = CanvasUtil.CreateImagePanel(gameObject, _imagePrompt, new CanvasUtil.RectData(size, Vector2.zero, new Vector2(0.5f, 0.75f), new Vector2(0.5f, 0.8f))); GameObject topTextOne = CanvasUtil.CreateTextPanel(gameObject, _takeText, 34, TextAnchor.MiddleCenter, new CanvasUtil.RectData(new Vector2(1920, 100), Vector2.zero, new Vector2(0.5f, 0.55f), new Vector2(0.5f, 0.55f)), Fonts.Get("Perpetua")); GameObject topTextTwo = CanvasUtil.CreateTextPanel(gameObject, _nameText, 76, TextAnchor.MiddleCenter, new CanvasUtil.RectData(new Vector2(1920, 300), Vector2.zero, new Vector2(0.5f, 0.49f), new Vector2(0.5f, 0.49f))); CanvasGroup topImageCG = topImage.AddComponent <CanvasGroup>(); CanvasGroup topTextOneCG = topTextOne.AddComponent <CanvasGroup>(); CanvasGroup topTextTwoCG = topTextTwo.AddComponent <CanvasGroup>(); topImageCG.blocksRaycasts = false; topImageCG.interactable = false; topImageCG.alpha = 0; topTextOneCG.blocksRaycasts = false; topTextOneCG.interactable = false; topTextOneCG.alpha = 0; topTextTwoCG.blocksRaycasts = false; topTextTwoCG.interactable = false; topTextTwoCG.alpha = 0; StartCoroutine(FadeInCanvasGroup(topImageCG)); StartCoroutine(FadeInCanvasGroup(topTextOneCG)); yield return(StartCoroutine(FadeInCanvasGroup(topTextTwoCG))); // Animate the middle fleur GameObject fleur = CanvasUtil.CreateImagePanel(gameObject, Frames[0], new CanvasUtil.RectData(new Vector2(Frames[0].texture.width / 1.6f, Frames[0].texture.height / 1.6f), Vector2.zero, new Vector2(0.5f, 0.4125f), new Vector2(0.5f, 0.4125f))); yield return(StartCoroutine(AnimateFleur(fleur, 12))); yield return(WaitForSeconds(0.25f)); // Fade in the remaining text GameObject botTextOne = CanvasUtil.CreateTextPanel(gameObject, _buttonText, 34, TextAnchor.MiddleCenter, new CanvasUtil.RectData(new Vector2(1920, 100), Vector2.zero, new Vector2(0.5f, 0.335f), new Vector2(0.5f, 0.335f)), Fonts.Get("Perpetua")); GameObject botTextTwo = CanvasUtil.CreateTextPanel(gameObject, _descOneText, 34, TextAnchor.MiddleCenter, new CanvasUtil.RectData(new Vector2(1920, 100), Vector2.zero, new Vector2(0.5f, 0.26f), new Vector2(0.5f, 0.26f)), Fonts.Get("Perpetua")); GameObject botTextThree = CanvasUtil.CreateTextPanel(gameObject, _descTwoText, 34, TextAnchor.MiddleCenter, new CanvasUtil.RectData(new Vector2(1920, 100), Vector2.zero, new Vector2(0.5f, 0.205f), new Vector2(0.5f, 0.205f)), Fonts.Get("Perpetua")); CanvasGroup botTextOneCG = botTextOne.AddComponent <CanvasGroup>(); CanvasGroup botTextTwoCG = botTextTwo.AddComponent <CanvasGroup>(); CanvasGroup botTextThreeCG = botTextThree.AddComponent <CanvasGroup>(); botTextOneCG.blocksRaycasts = false; botTextOneCG.interactable = false; botTextOneCG.alpha = 0; botTextTwoCG.blocksRaycasts = false; botTextTwoCG.interactable = false; botTextTwoCG.alpha = 0; botTextThreeCG.blocksRaycasts = false; botTextThreeCG.interactable = false; botTextThreeCG.alpha = 0; yield return(StartCoroutine(FadeInCanvasGroup(botTextOneCG))); StartCoroutine(FadeInCanvasGroup(botTextTwoCG)); yield return(StartCoroutine(FadeInCanvasGroup(botTextThreeCG))); yield return(WaitForSeconds(1.5f)); // Can I offer you an egg in this trying time? GameObject egg = CanvasUtil.CreateImagePanel(gameObject, AreaRando.GetSprite("UI.egg"), new CanvasUtil.RectData( new Vector2(AreaRando.GetSprite("UI.egg").texture.width / 1.65f, AreaRando.GetSprite("UI.egg").texture.height / 1.65f), Vector2.zero, new Vector2(0.5f, 0.1075f), new Vector2(0.5f, 0.1075f))); CanvasGroup eggCG = egg.AddComponent <CanvasGroup>(); eggCG.blocksRaycasts = false; eggCG.interactable = false; eggCG.alpha = 0; // Should wait for one fade in, don't want to poll input immediately yield return(FadeInCanvasGroup(eggCG)); // Stop doing things instantly before polling input if (!_showInstantly) { StopCoroutine(skipCoroutine); } _showInstantly = false; // Save the coroutine to stop it later Coroutine coroutine = StartCoroutine(BlinkCanvasGroup(eggCG)); // Wait for the user to cancel the menu while (true) { HeroActions actions = Ref.Input.inputActions; if (actions.jump.WasPressed || actions.attack.WasPressed || actions.menuCancel.WasPressed) { break; } yield return(new WaitForEndOfFrame()); } // Fade out the full popup yield return(FadeOutCanvasGroup(gameObject.GetComponent <CanvasGroup>())); // Small delay before hero control yield return(WaitForSeconds(0.75f)); // Optionally send FSM event after finishing if (_fsmObj != null && _fsmEvent != null) { FSMUtility.SendEventToGameObject(_fsmObj, _fsmEvent); } // Stop the egg routine and destroy everything StopCoroutine(coroutine); Destroy(gameObject); }
// This function does damage to the enemy using the damage numbers given by the weapon type public static void HitEnemy(HealthManager targetHP, int damageDealt, HitInstance hitInstance, int soulGain, BulletBehaviour hpbb) { //TODO: this specifics might add up later, Moss Charger is just one of the few except and there maybe many more if (targetHP == null) { return; } int cardinalDirection = DirectionUtils.GetCardinalDirection(hitInstance.GetActualDirection(targetHP.transform)); GameObject blockHitPrefab = targetHP.GetAttr <GameObject>("blockHitPrefab"); bool specialEnemy = (targetHP.name.Contains("Charger")); if (targetHP.IsBlockingByDirection(cardinalDirection, AttackTypes.Nail) && !specialEnemy || damageDealt <= 0) { FSMUtility.SendEventToGameObject(targetHP.gameObject, "BLOCKED HIT", false); GameObject blockHit = blockHitPrefab.Spawn(); blockHit.transform.position = targetHP.transform.position; blockHit.transform.Rotate(new Vector3(0, 0, 90 * cardinalDirection)); return; } if (damageDealt <= 0) { return; } //bool specialEnemy = (targetHP.name.Contains("Moss Charger") || targetHP.name.Contains("Mushroom Brawler")); /* * if (targetHP.IsInvincible && !specialEnemy && !PlayerData.instance.equippedCharm_25) * { * GameObject blockHit = blockHitPrefab.Spawn(); * blockHit.transform.position = targetHP.transform.position; * return; * } */ if (targetHP.gameObject.name.Contains("Blocker")) //double damage baldurs { damageDealt = damageDealt * 4; } Recoil recoil = targetHP.gameObject.GetComponent <Recoil>(); //if (recoil != null && PlayerData.instance.equippedCharm_15) if (recoil != null) { recoil.RecoilByDirection(cardinalDirection, 0.25f); } /* * Mostly code copied from the healthmanager class itself. */ FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false); GameObject sendHitGO = targetHP.GetAttr <GameObject>("sendHitGO"); if (sendHitGO != null) { FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false); } GameObject HitPrefab = targetHP.GetAttr <GameObject>("strikeNailPrefab"); GameObject ImpactPrefab = targetHP.GetAttr <GameObject>("slashImpactPrefab"); Vector3? effectOrigin = targetHP.GetAttr <Vector3?>("effectOrigin"); if (HitPrefab != null && effectOrigin != null) { HitPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f); } if (ImpactPrefab != null && effectOrigin != null) { ImpactPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f); } SpriteFlash f = targetHP.gameObject.GetComponent <SpriteFlash>(); if (f != null) { f.flashWhiteQuick(); } //Log("SEVERITY: " + ds + " DAMAGE: " + damageDealt); FSMUtility.SendEventToGameObject(targetHP.gameObject, "TOOK DAMAGE", false); FSMUtility.SendEventToGameObject(targetHP.gameObject, "TAKE DAMAGE", false); FSMUtility.SendEventToGameObject(hitInstance.Source, "HIT LANDED", false); FSMUtility.SendEventToGameObject(hitInstance.Source, "DEALT DAMAGE", false); // Actually do damage to target. LoadAssets.sfxDictionary.TryGetValue("enemyhurt" + soundRandom.Next(1, 4) + ".wav", out AudioClip hurtSound); HeroController.instance.spellControl.gameObject.GetComponent <AudioSource>().PlayOneShot(hurtSound); if (targetHP.damageOverride) { targetHP.hp -= 1; } else { targetHP.hp -= damageDealt; // the actual damage //int sg = (ds.Equals(DamageSeverity.Minor)) ? 0 : soulGain; HeroController.instance.AddMPCharge(6); Stats.IncreaseAdrenalinePoints(damageDealt); } // Trigger Kill animation if (targetHP.hp <= 0f) { LoadAssets.sfxDictionary.TryGetValue("enemydead" + soundRandom.Next(1, 4) + ".wav", out AudioClip deadSound); HeroController.instance.spellControl.gameObject.GetComponent <AudioSource>().PlayOneShot(deadSound); targetHP.Die(cardinalDirection * 90, AttackTypes.Spell, true); HeroController.instance.AddMPCharge(4); GameManager.instance.FreezeMoment(1); return; } bool? hasAlternateHitAnimation = targetHP.GetAttr <bool?>("hasAlternateHitAnimation"); string alternateHitAnimation = targetHP.GetAttr <string>("alternateHitAnimation"); if (hasAlternateHitAnimation != null && (bool)hasAlternateHitAnimation && targetHP.GetComponent <tk2dSpriteAnimator>() && alternateHitAnimation != null) { targetHP.GetComponent <tk2dSpriteAnimator>().Play(alternateHitAnimation); } PlayMakerFSM stunControlFSM = targetHP.gameObject.GetComponents <PlayMakerFSM>().FirstOrDefault(component => component.FsmName == "Stun Control" || component.FsmName == "Stun"); if (stunControlFSM != null) { //stunControlFSM.SendEvent("STUN DAMAGE"); } /* * Uncomment below for a sick looking enter the gungeon style freeze frame or for camera shake. */ }
public static void SetShopItems(GameObject shopObj, string[] items) { ShopMenuStock shop = shopObj.GetComponent <ShopMenuStock>(); GameObject itemPrefab = UObject.Instantiate(shop.stock[0]); itemPrefab.transform.SetPosition2D(-1000, -1000); // Remove all charm type items from the store List <GameObject> newStock = new List <GameObject>(); foreach (string itemId in items) { Item item = RandoResources.Items.First(i => i.Id == itemId.Substring(0, itemId.IndexOf('.'))); if (!item.TryGetNextStage(out ItemStage stage)) { continue; } // Create a new shop item for this item def GameObject newItemObj = UObject.Instantiate(itemPrefab); // Apply all the stored values ShopItemStats stats = newItemObj.GetComponent <ShopItemStats>(); stats.playerDataBoolName = RandomizerMod.Instance.ItemPlacements[itemId] + "." + itemId; stats.nameConvo = stage.Shop.Name; stats.descConvo = stage.Shop.Description; stats.requiredPlayerDataBool = "CheckHasRequired." + RandomizerMod.Instance.ItemPlacements[itemId]; stats.notchCostBool = string.Empty; stats.cost = RandomizerMod.Instance.ItemCosts[itemId]; // Need to set all these to make sure the item doesn't break in one of various ways stats.priceConvo = ""; stats.specialType = 2; stats.charmsRequired = 0; stats.relicNumber = 0; // Apply the sprite for the UI stats.transform.Find("Item Sprite").gameObject.GetComponent <SpriteRenderer>().sprite = Sprites.Get(stage.Shop.Sprite); UObject.Destroy(stats.transform.Find("Item Sprite").gameObject.LocateMyFSM("get_charm_sprite")); newStock.Add(newItemObj); } UObject.Destroy(itemPrefab); foreach (GameObject item in shop.stock) { // Update normal stock (specialType: 0 = lantern, elegant key, quill; 1 = mask, 2 = charm, 3 = vessel, 4-7 = relics, 8 = notch, 9 = map, 10 = simple key, 11 = egg, 12-14 = repair fragile, 15 = salubra blessing, 16 = map pin, 17 = map marker) if (item.GetComponent <ShopItemStats>().specialType == 9 || item.GetComponent <ShopItemStats>().playerDataBoolName == "hasQuill") { continue; } string shopBool = item.GetComponent <ShopItemStats>().playerDataBoolName; if (!RandoResources.Items.Any(i => i.Stages.Any(s => s.BoolActions.Any(b => b.FieldName == shopBool))) && !shopBool.StartsWith("salubraNotch")) { // LogicManager doesn't know about this shop item, which means it's never potentially randomized. Put it back! newStock.Add(item); } } shop.stock = newStock.ToArray(); // Update alt stock; Sly only if (shop.stockAlt != null) { // Save unchanged list for potential alt stock List <GameObject> altStock = new List <GameObject>(); altStock.AddRange(newStock); foreach (GameObject item in shop.stockAlt) { string shopBool = item.GetComponent <ShopItemStats>().playerDataBoolName; if (!RandoResources.Items.Any(i => i.Stages.Any(s => s.BoolActions.Any(b => b.FieldName == shopBool))) && !newStock.Contains(item)) { altStock.Add(item); } } shop.stockAlt = altStock.ToArray(); } FSMUtility.SendEventToGameObject(GameObject.Find("Item List"), "RESET"); }
public static void applyHitInstance(GameObject target, int expectedDamage, GameObject source, float flameGain) { int realDamage = expectedDamage; double multiplier = 1; if (PlayerData.instance.GetBool("equippedCharm_25")) { multiplier *= 1.5; } if (PlayerData.instance.GetBool("equippedCharm_6") && PlayerData.instance.GetInt("health") == 1) { multiplier *= 1.75f; } if (gng_bindings.hasNailBinding()) { multiplier *= 0.3; } realDamage = (int)Math.Round(realDamage * multiplier); if (realDamage <= 0) { return; } HealthManager targetHP = getHealthManagerRecursive(target); if (targetHP == null) { return; } if (GameManager.instance.GetComponent <rebalanced_hooks>() != null) { GameManager.instance.GetComponent <rebalanced_hooks>().flamePower += flameGain; } //Modding.Logger.Log("[Redwing] Doing " + realDamage + " damage with attack name " + source.name); targetHP.hp -= realDamage; if (targetHP.hp <= 0f) { targetHP.Die(0f, AttackTypes.Nail, true); return; } FSMUtility.SendEventToGameObject(targetHP.gameObject, "BLOCKED HIT", false); FSMUtility.SendEventToGameObject(source, "HIT LANDED", false); if ((Object)targetHP.gameObject.GetComponent <DontClinkGates>() != (Object)null) { return; } FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false); GameManager.instance.FreezeMoment(1); GameCameras.instance.cameraShakeFSM.SendEvent("EnemyKillShake"); napalm memes = targetHP.gameObject.GetOrAddComponent <napalm>(); memes.addNapalm(realDamage * (0.10), Color.green); /* * targetHP.Hit(new HitInstance * { * Source = source, * AttackType = damageType, * CircleDirection = false, * DamageDealt = realDamage, * Direction = 0f, * IgnoreInvulnerable = true, * MagnitudeMultiplier = 1f, * MoveAngle = 0f, * MoveDirection = false, * Multiplier = 1f, * SpecialType = SpecialTypes.None, * IsExtraDamage = false * });*/ }
private void DoDamage(ColliderInfo target) { if (Damage <= 0) { return; } Component c = target.Responder as Component; if (c == null) { return; } FSMUtility.SendEventToGameObject(c.gameObject, "TAKE DAMAGE"); HitInstance hit = new HitInstance { Source = gameObject, AttackType = Type, CircleDirection = false, DamageDealt = Damage, IgnoreInvulnerable = false, MagnitudeMultiplier = 0, MoveAngle = 0, MoveDirection = false, Multiplier = 1, SpecialType = SpecialTypes.None, IsExtraDamage = false }; if (target.Responder is HealthManager hm) { float oldIframes = 0f; if (BypassIframes) { oldIframes = ReflectionHelper.GetAttr <HealthManager, float>(hm, "evasionByHitRemaining"); ReflectionHelper.SetAttr(hm, "evasionByHitRemaining", 0f); } PlayMakerFSM stunFSM = null; if (BypassStun) { stunFSM = ReflectionHelper.GetAttr <HealthManager, PlayMakerFSM>(hm, "stunControlFSM"); ReflectionHelper.SetAttr(hm, "stunControlFSM", (PlayMakerFSM)null); } hm.Hit(hit); if (BypassIframes) { ReflectionHelper.SetAttr(hm, "evasionByHitRemaining", oldIframes); } if (BypassStun) { ReflectionHelper.SetAttr(hm, "stunControlFSM", stunFSM); } } else { target.Responder.Hit(hit); } if (GainSoul) { Ref.Hero.SoulGain(); } }
// This function does damage to the enemy using the damage numbers given by the weapon type public static void hitEnemy(HealthManager targetHP, int expectedDamage, HitInstance hitInstance, int soulGain) { int realDamage = expectedDamage; // TODO: Add possible optional damage multiplier information below. /* * double multiplier = 1; * if (PlayerData.instance.GetBool("equippedCharm_25")) * { * multiplier *= 1.5; * } * if (PlayerData.instance.GetBool("equippedCharm_6") && PlayerData.instance.GetInt("health") == 1) * { * multiplier *= 1.75f; * } * * if (gng_bindings.hasNailBinding()) * { * multiplier *= 0.3; * } * realDamage = (int) Math.Round(realDamage * multiplier); * */ if (realDamage <= 0) { return; } if (targetHP == null) { return; } /* * Play animations and such... * Mostly code copied from the healthmanager class itself. */ int cardinalDirection = DirectionUtils.GetCardinalDirection(hitInstance.GetActualDirection(targetHP.transform)); FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false); GameObject sendHitGO = targetHP.GetAttr <GameObject>("sendHitGO"); if (sendHitGO != null) { Log("Wow I did reflection correctly"); FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false); } GameObject fireballHitPrefab = targetHP.GetAttr <GameObject>("fireballHitPrefab"); Vector3? effectOrigin = targetHP.GetAttr <Vector3?>("effectOrigin"); if (fireballHitPrefab != null && effectOrigin != null) { Log("Wow I did reflection correctly x2"); fireballHitPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f); } FSMUtility.SendEventToGameObject(targetHP.gameObject, "TOOK DAMAGE", false); if ((UnityEngine.Object)targetHP.GetComponent <Recoil>() != (UnityEngine.Object)null) { targetHP.GetComponent <Recoil>().RecoilByDirection(cardinalDirection, hitInstance.MagnitudeMultiplier); } FSMUtility.SendEventToGameObject(hitInstance.Source, "HIT LANDED", false); FSMUtility.SendEventToGameObject(hitInstance.Source, "DEALT DAMAGE", false); // Actually do damage to target. if (targetHP.damageOverride) { targetHP.hp -= 1; } else { targetHP.hp -= realDamage; HeroController.instance.AddMPCharge(soulGain); } // Trigger Kill animation if (targetHP.hp <= 0f) { targetHP.Die(0f, AttackTypes.Nail, true); return; } bool? hasAlternateHitAnimation = targetHP.GetAttr <bool?>("hasAlternateHitAnimation"); string alternateHitAnimation = targetHP.GetAttr <string>("alternateHitAnimation"); if (hasAlternateHitAnimation != null && (bool)hasAlternateHitAnimation && targetHP.GetComponent <tk2dSpriteAnimator>() && alternateHitAnimation != null) { Log("Wow I did reflection correctly x3"); targetHP.GetComponent <tk2dSpriteAnimator>().Play(alternateHitAnimation); } PlayMakerFSM stunControlFSM = targetHP.gameObject.GetComponents <PlayMakerFSM>().FirstOrDefault(component => component.FsmName == "Stun Control" || component.FsmName == "Stun"); if (stunControlFSM != null) { stunControlFSM.SendEvent("STUN DAMAGE"); } /* * Uncomment below for a sick looking enter the gungeon style freeze frame or for camera shake. */ //GameManager.instance.FreezeMoment(1); //GameCameras.instance.cameraShakeFSM.SendEvent("EnemyKillShake"); }
public override void OnSuccessfulHit(HitInfo info) { FSMUtility.SendEventToGameObject(info.Attacker, "HIT LANDED", false); }
//+++DAMAGE OVERRIDE+++ public static void DamageEnemyOverride(HealthManager targetHP, int damageDealt, HitInstance hitInstance, int soulGain, BulletBehaviour hpbb) { //TODO: this specifics might add up later, Moss Charger is just one of the few except and there maybe many more if (targetHP == null) { return; } int cardinalDirection = DirectionUtils.GetCardinalDirection(hitInstance.GetActualDirection(targetHP.transform)); GameObject blockHitPrefab = targetHP.GetAttr <GameObject>("blockHitPrefab"); bool specialEnemy = (targetHP.name.Contains("Charger")); if (targetHP.IsBlockingByDirection(cardinalDirection, AttackTypes.Nail) && !specialEnemy) { FSMUtility.SendEventToGameObject(targetHP.gameObject, "BLOCKED HIT", false); GameObject blockHit = blockHitPrefab.Spawn(); blockHit.transform.position = targetHP.transform.position; blockHit.transform.Rotate(new Vector3(0, 0, 90 * cardinalDirection)); return; } if (false && !targetHP.IsInvincible) //enable disable damage overtime { EnemyDamageOvertime dm = targetHP.gameObject.GetComponent <EnemyDamageOvertime>(); if (dm == null) { targetHP.gameObject.AddComponent <EnemyDamageOvertime>(); } else { dm.IncreaseStack(); } } //bool specialEnemy = (targetHP.name.Contains("Moss Charger") || targetHP.name.Contains("Mushroom Brawler")); /* * if (targetHP.IsInvincible && !specialEnemy && !PlayerData.instance.equippedCharm_25) * { * GameObject blockHit = blockHitPrefab.Spawn(); * blockHit.transform.position = targetHP.transform.position; * return; * } */ if (targetHP.gameObject.name.Contains("Blocker")) //double damage baldurs { damageDealt = damageDealt * 4; } Recoil recoil = targetHP.gameObject.GetComponent <Recoil>(); //if (recoil != null && PlayerData.instance.equippedCharm_15) if (recoil != null) { recoil.RecoilByDirection(cardinalDirection, 0.25f); } /* * Mostly code copied from the healthmanager class itself. */ FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false); GameObject sendHitGO = targetHP.GetAttr <GameObject>("sendHitGO"); if (sendHitGO != null) { FSMUtility.SendEventToGameObject(targetHP.gameObject, "HIT", false); } GameObject HitPrefab = targetHP.GetAttr <GameObject>("strikeNailPrefab"); GameObject ImpactPrefab = targetHP.GetAttr <GameObject>("slashImpactPrefab"); Vector3? effectOrigin = targetHP.GetAttr <Vector3?>("effectOrigin"); if (HitPrefab != null && effectOrigin != null) { HitPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f); } if (ImpactPrefab != null && effectOrigin != null) { ImpactPrefab.Spawn(targetHP.transform.position + (Vector3)effectOrigin, Quaternion.identity).transform.SetPositionZ(0.0031f); } SpriteFlash f = targetHP.gameObject.GetComponent <SpriteFlash>(); if (f != null) { f.flashWhiteQuick(); } FSMUtility.SendEventToGameObject(targetHP.gameObject, "TOOK DAMAGE", false); FSMUtility.SendEventToGameObject(targetHP.gameObject, "TAKE DAMAGE", false); FSMUtility.SendEventToGameObject(hitInstance.Source, "HIT LANDED", false); FSMUtility.SendEventToGameObject(hitInstance.Source, "DEALT DAMAGE", false); // Actually do damage to target. LoadAssets.sfxDictionary.TryGetValue("enemyhurt" + rand.Next(1, 4) + ".wav", out AudioClip hurtSound); HeroController.instance.spellControl.gameObject.GetComponent <AudioSource>().PlayOneShot(hurtSound); if (targetHP.damageOverride) { targetHP.hp -= 1; } else { targetHP.hp -= damageDealt; // the actual damage if (hpbb.canGainEnergyCharges) { HeroController.instance.AddMPCharge(Stats.instance.current_soulGainedPerHit); } Stats.instance.IncreaseAdrenalineChargeEnergy(); //TODO: change this audio source location to the sound handler AudioHandler.instance.PlayMiscSoundEffect(AudioHandler.HollowPointSoundType.EnemyHitSFXGO); } // Trigger Enemy Kill if (targetHP.hp <= 0f) { EnemyDeathEvent(targetHP, cardinalDirection, true); return; } bool? hasAlternateHitAnimation = targetHP.GetAttr <bool?>("hasAlternateHitAnimation"); string alternateHitAnimation = targetHP.GetAttr <string>("alternateHitAnimation"); if (hasAlternateHitAnimation != null && (bool)hasAlternateHitAnimation && targetHP.GetComponent <tk2dSpriteAnimator>() && alternateHitAnimation != null) { targetHP.GetComponent <tk2dSpriteAnimator>().Play(alternateHitAnimation); } PlayMakerFSM stunControlFSM = targetHP.gameObject.GetComponents <PlayMakerFSM>().FirstOrDefault(component => component.FsmName == "Stun Control" || component.FsmName == "Stun"); //if (stunControlFSM != null) stunControlFSM.SendEvent("STUN DAMAGE"); }