Files
YHTMod/Changes/SummonerOnHitEffects.cs

151 lines
5.7 KiB
C#

using Terraria;
using Terraria.DataStructures;
using Terraria.ID;
using Terraria.ModLoader;
using YHTMod.Buffs;
using Vector2 = Microsoft.Xna.Framework.Vector2;
namespace YHTMod.Changes;
[ExtendsFromMod("CalamityMod")]
public class SummonerOnHitEffects : GlobalProjectile {
public override void OnSpawn(Projectile projectile, IEntitySource source) {
Mod calamity = CalamityHelper.GetCalamityMod();
if (calamity is null
|| source is not EntitySource_Parent { Entity: Projectile { friendly: true } parentProj }
|| parentProj.hostile
) {
base.OnSpawn(projectile, source);
return;
}
// Get Calamity projectile types safely
if (!calamity.TryFind("ShadeNimbusHostile", out ModProjectile shadeNimbus)
|| parentProj.type != shadeNimbus.Type
) {
base.OnSpawn(projectile, source);
return;
}
if (!calamity.TryFind("ShaderainHostile", out ModProjectile shaderainHostile) ||
projectile.type != shaderainHostile.Type) {
base.OnSpawn(projectile, source);
return;
}
projectile.friendly = true;
projectile.hostile = false;
projectile.DamageType = DamageClass.Summon;
projectile.damage = parentProj.damage;
base.OnSpawn(projectile, source);
}
public override void OnHitNPC(Projectile projectile, NPC target, NPC.HitInfo hit, int damageDone) {
Player player = Main.player[projectile.owner];
YhtPlayer modPlayer = player.GetModPlayer<YhtPlayer>();
// Player's own minions
if (projectile.minion && Main.myPlayer == projectile.owner) {
if (modPlayer.SummonerAmbition) {
HandleDeerclopsEffect(modPlayer, target, projectile);
HandleQueenBeeEffect(modPlayer, target);
HandlePerforatorsEffect(modPlayer, target, projectile);
HandleHiveMindEffect(modPlayer, target, projectile);
}
}
// Whips
if (modPlayer.SummonerAmbition && ProjectileID.Sets.IsAWhip[projectile.type]) {
if (modPlayer.SummonerAmbitions.Contains("eye_of_cthulhu")) {
projectile.damage = (int)(projectile.damage * 1.1);
}
if (ModLoader.HasMod("CalamityMod")) {
if (modPlayer.SummonerAmbitions.Contains("crabulon")) {
target.AddBuff(ModContent.BuffType<ShroomGlowDebuff>(), 5 * 60);
}
}
}
base.OnHitNPC(projectile, target, hit, damageDone);
}
private static void HandleDeerclopsEffect(YhtPlayer modPlayer, NPC target, Projectile projectile) {
Player player = modPlayer.Player;
if (!modPlayer.SummonerAmbitions.Contains("deerclops")) return;
if (modPlayer.SummonerAmbitionDeerclopsCooldown != 0) return;
if (!Main.rand.NextBool(10)) return;
modPlayer.SummonerAmbitionDeerclopsCooldown = 5 * 60;
Vector2 direction = new(Main.rand.NextFloat(-1f, 1f), Main.rand.NextFloat(-1f, 1f));
direction.Normalize();
direction *= Main.rand.NextFloat(4f, 8f);
Projectile.NewProjectile(
player.GetSource_OnHit(target),
target.Center,
direction,
ProjectileID.InsanityShadowFriendly,
(int) (projectile.damage * 0.5),
0f,
projectile.owner
);
}
private static void HandleQueenBeeEffect(YhtPlayer modPlayer, NPC target) {
if (!modPlayer.SummonerAmbitions.Contains("queen_bee")) return;
if (!Main.rand.NextBool(4)) return;
target.AddBuff(BuffID.Poisoned, 5 * 60);
}
private static void HandlePerforatorsEffect(YhtPlayer modPlayer, NPC target, Projectile projectile) {
if (!ModLoader.HasMod("CalamityMod")) return;
if (!modPlayer.SummonerAmbitions.Contains("perforators")) return;
if (modPlayer.SummonerAmbitionPerforatorsCooldown != 0) return;
if (!Main.rand.NextBool(10)) return;
modPlayer.SummonerAmbitionPerforatorsCooldown = 20 * 60;
Vector2 direction = new(Main.rand.NextFloat(-1f, 1f), Main.rand.NextFloat(-1f, 1f));
direction.Normalize();
direction *= Main.rand.NextFloat(4f, 5f);
int projectileType = ModContent.ProjectileType<CalamityMod.Projectiles.Boss.IchorBlob>();
int projectileId = Projectile.NewProjectile(
modPlayer.Player.GetSource_OnHit(target),
target.Center,
direction,
projectileType,
(int) (projectile.damage * 0.75f),
0f,
projectile.owner
);
Projectile blob = Main.projectile[projectileId];
blob.friendly = true;
blob.hostile = false;
blob.DamageType = DamageClass.Summon;
}
private static void HandleHiveMindEffect(YhtPlayer modPlayer, NPC target, Projectile projectile) {
if (!ModLoader.HasMod("CalamityMod")) return;
if (!modPlayer.SummonerAmbitions.Contains("hive_mind")) return;
if (modPlayer.SummonerAmbitionHiveMindCooldown != 0) return;
if (!Main.rand.NextBool(10)) return;
modPlayer.SummonerAmbitionHiveMindCooldown = 3 * 60;
int projectileType = ModContent.ProjectileType<CalamityMod.Projectiles.Boss.ShadeNimbusHostile>();
int projectileId = Projectile.NewProjectile(
modPlayer.Player.GetSource_OnHit(target),
target.Center,
new Vector2(0, -0.25f),
projectileType,
(int) (projectile.damage * 0.75f),
0f,
projectile.owner
);
Projectile blob = Main.projectile[projectileId];
blob.friendly = true;
blob.hostile = false;
blob.DamageType = DamageClass.Summon;
}
}