using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using Terraria;
using Terraria.GameContent;
using Terraria.ID;
using Terraria.ModLoader;
namespace SoulHarvest.Projectiles;
public class DomainSoulBladeProjectile : ModProjectile
{
public override string Texture => "Terraria/Images/Projectile_0";
public override void SetStaticDefaults()
{
ProjectileID.Sets.TrailCacheLength[Type] = 12;
ProjectileID.Sets.TrailingMode[Type] = 2;
}
public override void SetDefaults()
{
Projectile.width = 30;
Projectile.height = 30;
Projectile.friendly = true;
Projectile.hostile = false;
Projectile.tileCollide = false;
Projectile.ignoreWater = true;
Projectile.penetrate = 3;
Projectile.timeLeft = 150;
Projectile.usesLocalNPCImmunity = true;
Projectile.localNPCHitCooldown = 15;
}
public override void AI()
{
Projectile.rotation = Projectile.velocity.ToRotation() + MathHelper.PiOver4;
NPC? target = FindTarget(700f);
if (target is not null)
{
float speed = Math.Max(8f, Projectile.velocity.Length());
Vector2 desired = (target.Center - Projectile.Center).SafeNormalize(Vector2.UnitX) * speed;
Projectile.velocity = Vector2.Lerp(Projectile.velocity, desired, 0.075f);
}
if (Main.rand.NextBool(2))
{
Dust dust = Dust.NewDustPerfect(Projectile.Center, DustID.DungeonSpirit, -Projectile.velocity * 0.08f, 80, new Color(105, 225, 245), 0.65f);
dust.noGravity = true;
}
}
public override bool PreDraw(ref Color lightColor)
{
int itemType = (int)Projectile.ai[0];
if (itemType <= ItemID.None || itemType >= ItemLoader.ItemCount)
return false;
Main.instance.LoadItem(itemType);
Texture2D texture = TextureAssets.Item[itemType].Value;
Rectangle frame = Main.itemAnimations[itemType]?.GetFrame(texture) ?? texture.Frame();
float scale = Math.Min(0.7f, 42f / Math.Max(frame.Width, frame.Height));
Vector2 origin = frame.Size() * 0.5f;
for (int index = Projectile.oldPos.Length - 1; index >= 0; index--)
{
if (Projectile.oldPos[index] == Vector2.Zero)
continue;
float progress = 1f - index / (float)Projectile.oldPos.Length;
Color color = Color.Lerp(new Color(210, 25, 75), new Color(75, 225, 245), progress) * (progress * 0.5f);
Vector2 position = Projectile.oldPos[index] + Projectile.Size * 0.5f - Main.screenPosition;
Main.EntitySpriteDraw(texture, position, frame, color, Projectile.oldRot[index], origin, scale * (0.75f + progress * 0.25f), SpriteEffects.None);
}
Main.EntitySpriteDraw(texture, Projectile.Center - Main.screenPosition, frame, Color.White, Projectile.rotation, origin, scale, SpriteEffects.None);
return false;
}
private NPC? FindTarget(float maximumDistance)
{
NPC? result = null;
foreach (NPC npc in Main.ActiveNPCs)
{
if (!npc.CanBeChasedBy(Projectile))
continue;
float distance = Vector2.Distance(npc.Center, Projectile.Center);
if (distance < maximumDistance)
{
maximumDistance = distance;
result = npc;
}
}
return result;
}
}
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using Terraria;
using Terraria.GameContent;
using Terraria.ID;
using Terraria.ModLoader;
namespace SoulHarvest.Projectiles;
public class DomainSoulBladeProjectile : ModProjectile
{
public override string Texture => "Terraria/Images/Projectile_0";
public override void SetStaticDefaults()
{
ProjectileID.Sets.TrailCacheLength[Type] = 12;
ProjectileID.Sets.TrailingMode[Type] = 2;
}
public override void SetDefaults()
{
Projectile.width = 30;
Projectile.height = 30;
Projectile.friendly = true;
Projectile.hostile = false;
Projectile.tileCollide = false;
Projectile.ignoreWater = true;
Projectile.penetrate = 3;
Projectile.timeLeft = 150;
Projectile.usesLocalNPCImmunity = true;
Projectile.localNPCHitCooldown = 15;
}
public override void AI()
{
Projectile.rotation = Projectile.velocity.ToRotation() + MathHelper.PiOver4;
NPC? target = FindTarget(700f);
if (target is not null)
{
float speed = Math.Max(8f, Projectile.velocity.Length());
Vector2 desired = (target.Center - Projectile.Center).SafeNormalize(Vector2.UnitX) * speed;
Projectile.velocity = Vector2.Lerp(Projectile.velocity, desired, 0.075f);
}
if (Main.rand.NextBool(2))
{
Dust dust = Dust.NewDustPerfect(Projectile.Center, DustID.DungeonSpirit, -Projectile.velocity * 0.08f, 80, new Color(105, 225, 245), 0.65f);
dust.noGravity = true;
}
}
public override bool PreDraw(ref Color lightColor)
{
int itemType = (int)Projectile.ai[0];
if (itemType <= ItemID.None || itemType >= ItemLoader.ItemCount)
return false;
Main.instance.LoadItem(itemType);
Texture2D texture = TextureAssets.Item[itemType].Value;
Rectangle frame = Main.itemAnimations[itemType]?.GetFrame(texture) ?? texture.Frame();
float scale = Math.Min(0.7f, 42f / Math.Max(frame.Width, frame.Height));
Vector2 origin = frame.Size() * 0.5f;
for (int index = Projectile.oldPos.Length - 1; index >= 0; index--)
{
if (Projectile.oldPos[index] == Vector2.Zero)
continue;
float progress = 1f - index / (float)Projectile.oldPos.Length;
Color color = Color.Lerp(new Color(210, 25, 75), new Color(75, 225, 245), progress) * (progress * 0.5f);
Vector2 position = Projectile.oldPos[index] + Projectile.Size * 0.5f - Main.screenPosition;
Main.EntitySpriteDraw(texture, position, frame, color, Projectile.oldRot[index], origin, scale * (0.75f + progress * 0.25f), SpriteEffects.None);
}
Main.EntitySpriteDraw(texture, Projectile.Center - Main.screenPosition, frame, Color.White, Projectile.rotation, origin, scale, SpriteEffects.None);
return false;
}
private NPC? FindTarget(float maximumDistance)
{
NPC? result = null;
foreach (NPC npc in Main.ActiveNPCs)
{
if (!npc.CanBeChasedBy(Projectile))
continue;
float distance = Vector2.Distance(npc.Center, Projectile.Center);
if (distance < maximumDistance)
{
maximumDistance = distance;
result = npc;
}
}
return result;
}
}