152 lines
4.6 KiB
C#
152 lines
4.6 KiB
C#
using System.Collections.Generic;
|
|
using Decimation.Lib.Items;
|
|
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
using Terraria;
|
|
using Terraria.ID;
|
|
|
|
namespace Decimation.Content.Projectiles.DuneWyrm
|
|
{
|
|
public class Sundial : DecimationProjectile
|
|
{
|
|
private static readonly IDictionary<int, int> ProjectilesIndex = new Dictionary<int, int>();
|
|
private static readonly IDictionary<int, int> ProjectilesCount = new Dictionary<int, int>();
|
|
|
|
public static void Reset()
|
|
{
|
|
ProjectilesIndex.Clear();
|
|
ProjectilesCount.Clear();
|
|
}
|
|
|
|
protected override int AnimationFrames => 12;
|
|
protected override int AnimationFps => 1;
|
|
protected override DecimationWeapon.DamageType DamageType => DecimationWeapon.DamageType.Magic;
|
|
protected override int Damages => 15;
|
|
|
|
private const int IndexResetCounterMax = 30;
|
|
private bool _killAnimationPlayer = false;
|
|
|
|
private int ProjectileIndex
|
|
{
|
|
get
|
|
{
|
|
if (!ProjectilesIndex.ContainsKey(Owner)) ProjectilesIndex[Owner] = 0;
|
|
return ProjectilesIndex[Owner];
|
|
}
|
|
set
|
|
{
|
|
int index = value;
|
|
if (index >= AnimationFrames) index = 0;
|
|
ProjectilesIndex[Owner] = index;
|
|
}
|
|
}
|
|
|
|
private int Count
|
|
{
|
|
get
|
|
{
|
|
if (!ProjectilesCount.ContainsKey(Owner)) Count = 0;
|
|
return ProjectilesCount[Owner];
|
|
}
|
|
set => ProjectilesCount[Owner] = value;
|
|
}
|
|
|
|
private int Index
|
|
{
|
|
get => (int) projectile.localAI[0];
|
|
set => projectile.localAI[0] = value;
|
|
}
|
|
|
|
private int Owner
|
|
{
|
|
get => (int) projectile.localAI[1];
|
|
set => projectile.localAI[1] = value;
|
|
}
|
|
|
|
private bool EndOfLife => projectile.timeLeft < IndexResetCounterMax || projectile.penetrate <= 1;
|
|
|
|
protected override void Init()
|
|
{
|
|
projectile.width = 20;
|
|
projectile.height = 22;
|
|
projectile.timeLeft = 180 + IndexResetCounterMax;
|
|
projectile.aiStyle = -1;
|
|
projectile.tileCollide = false;
|
|
projectile.knockBack = 7;
|
|
|
|
Owner = projectile.owner;
|
|
if (Count++ == 0) ProjectileIndex = 0;
|
|
Index = ++ProjectileIndex;
|
|
|
|
projectile.penetrate = Index + 1;
|
|
}
|
|
|
|
public override bool PreKill(int timeLeft)
|
|
{
|
|
Count -= 1;
|
|
|
|
return true;
|
|
}
|
|
|
|
public override bool PreAI()
|
|
{
|
|
projectile.frame = Index - 1;
|
|
if (projectile.frame >= AnimationFrames) projectile.frame = AnimationFrames - 1;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
public override void AI()
|
|
{
|
|
if (EndOfLife)
|
|
{
|
|
projectile.velocity = Vector2.Zero;
|
|
projectile.penetrate = -1;
|
|
projectile.damage = 0;
|
|
projectile.alpha = 0;
|
|
|
|
if (!_killAnimationPlayer)
|
|
{
|
|
Main.PlaySound(SoundID.Item27, projectile.Center);
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
Dust.NewDust(projectile.position, projectile.width, projectile.height, 135, 0,
|
|
0, 100, default, 4f * projectile.scale);
|
|
}
|
|
|
|
_killAnimationPlayer = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Lighting.AddLight(projectile.Center, 0, 0.8f, 1);
|
|
Dust.NewDust(projectile.position, projectile.width, projectile.height, 135,
|
|
projectile.velocity.X * 0.2f,
|
|
projectile.velocity.Y * 0.2f, 100, default, 1f * projectile.scale);
|
|
|
|
projectile.velocity.Normalize();
|
|
projectile.velocity *= Index;
|
|
|
|
if (Index >= 6) projectile.damage = 25;
|
|
if (Index >= 12) projectile.damage = 35;
|
|
}
|
|
}
|
|
|
|
public override void OnHitNPC(NPC target, int damage, float knockback, bool crit)
|
|
{
|
|
if (Index == 1) target.AddBuff(BuffID.Slow, 300);
|
|
}
|
|
|
|
public override void OnHitPvp(Player target, int damage, bool crit)
|
|
{
|
|
if (Index == 1) target.AddBuff(BuffID.Slow, 300);
|
|
}
|
|
|
|
public override bool PreDraw(SpriteBatch spriteBatch, Color lightColor)
|
|
{
|
|
return !EndOfLife; // projectile.alpha = 0 does not always work?
|
|
}
|
|
}
|
|
} |