- Added support for animated projectiles - Refactoring - Removed useless fields - Fixed swords not dealing damages - Added Hour Hand (from Evie's PR)
142 lines
6.9 KiB
C#
142 lines
6.9 KiB
C#
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
using System;
|
|
using Decimation.Content.Items.Weapons;
|
|
using Decimation.Lib.Items;
|
|
using Terraria;
|
|
using Terraria.ID;
|
|
using Terraria.ModLoader;
|
|
|
|
namespace Decimation.Content.Projectiles
|
|
{
|
|
internal class MoltenStyngerBolt : DecimationProjectile
|
|
{
|
|
public override void SetStaticDefaults()
|
|
{
|
|
DisplayName.SetDefault("Molten Stynger Bolt");
|
|
ProjectileID.Sets.TrailCacheLength[projectile.type] = 5;
|
|
ProjectileID.Sets.TrailingMode[projectile.type] = 0;
|
|
}
|
|
|
|
protected override void Init()
|
|
{
|
|
projectile.width = 10;
|
|
projectile.height = 10;
|
|
projectile.aiStyle = 1;
|
|
DamageType = DecimationWeapon.DamageType.Ranged;
|
|
projectile.penetrate = 1;
|
|
projectile.timeLeft = 600;
|
|
projectile.alpha = 255;
|
|
projectile.light = 0.5f;
|
|
projectile.ignoreWater = false;
|
|
projectile.tileCollide = true;
|
|
projectile.extraUpdates = 1;
|
|
aiType = ProjectileID.Bullet;
|
|
}
|
|
|
|
public override bool OnTileCollide(Vector2 oldVelocity)
|
|
{
|
|
if (projectile.timeLeft > 3)
|
|
projectile.timeLeft = 3;
|
|
|
|
return false;
|
|
}
|
|
|
|
public override void OnHitNPC(NPC target, int damage, float knockback, bool crit)
|
|
{
|
|
if (projectile.timeLeft > 3)
|
|
projectile.timeLeft = 3;
|
|
}
|
|
|
|
public override void OnHitPvp(Player target, int damage, bool crit)
|
|
{
|
|
if (projectile.timeLeft > 3)
|
|
projectile.timeLeft = 3;
|
|
}
|
|
|
|
public override void Kill(int timeLeft)
|
|
{
|
|
projectile.penetrate = -1;
|
|
projectile.tileCollide = false;
|
|
projectile.alpha = 255;
|
|
projectile.position.X = projectile.position.X + (float)(projectile.width / 2f);
|
|
projectile.position.Y = projectile.position.Y + (float)(projectile.height / 2f);
|
|
projectile.width = 100;
|
|
projectile.height = 100;
|
|
projectile.position.X = projectile.position.X - (float)(projectile.width / 2f);
|
|
projectile.position.Y = projectile.position.Y - (float)(projectile.height / 2f);
|
|
Damages = 250;
|
|
projectile.knockBack = 10f;
|
|
|
|
SpawnDust();
|
|
int fragNbre = Main.rand.Next(8, 12);
|
|
for (int i = 0; i < fragNbre; i++)
|
|
{
|
|
float velocityX = (float)Main.rand.Next(-100, 101);
|
|
velocityX += 0.01f;
|
|
float velocityY = (float)Main.rand.Next(-100, 101);
|
|
velocityX -= 0.01f;
|
|
float sqrt = (float)Math.Sqrt((double)(velocityX * velocityX + velocityY * velocityY));
|
|
sqrt = 8f / sqrt;
|
|
velocityX *= sqrt;
|
|
velocityY *= sqrt;
|
|
Projectile.NewProjectile(projectile.Center.X - projectile.oldVelocity.X, projectile.Center.Y - projectile.oldVelocity.Y, velocityX, velocityY, ProjectileID.StyngerShrapnel, Damages, projectile.knockBack, projectile.owner, 0f, 0f);
|
|
}
|
|
}
|
|
|
|
private void SpawnDust()
|
|
{
|
|
|
|
// Play explosion sound
|
|
Main.PlaySound(SoundID.Item14, projectile.position);
|
|
// Smoke Dust spawn
|
|
for (int i = 0; i < 50; i++)
|
|
{
|
|
int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 31, 0f, 0f, 100, default(Color), 2f);
|
|
Main.dust[dustIndex].velocity *= 1.4f;
|
|
}
|
|
// Fire Dust spawn
|
|
for (int i = 0; i < 80; i++)
|
|
{
|
|
int dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 3f);
|
|
Main.dust[dustIndex].noGravity = true;
|
|
Main.dust[dustIndex].velocity *= 5f;
|
|
dustIndex = Dust.NewDust(new Vector2(projectile.position.X, projectile.position.Y), projectile.width, projectile.height, 6, 0f, 0f, 100, default(Color), 2f);
|
|
Main.dust[dustIndex].velocity *= 3f;
|
|
}
|
|
// Large Smoke Gore spawn
|
|
for (int g = 0; g < 2; g++)
|
|
{
|
|
int goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2f) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f);
|
|
Main.gore[goreIndex].scale = 1.5f;
|
|
Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f;
|
|
Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f;
|
|
goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2f) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f);
|
|
Main.gore[goreIndex].scale = 1.5f;
|
|
Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f;
|
|
Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y + 1.5f;
|
|
goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2f) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f);
|
|
Main.gore[goreIndex].scale = 1.5f;
|
|
Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X + 1.5f;
|
|
Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f;
|
|
goreIndex = Gore.NewGore(new Vector2(projectile.position.X + (float)(projectile.width / 2) - 24f, projectile.position.Y + (float)(projectile.height / 2f) - 24f), default(Vector2), Main.rand.Next(61, 64), 1f);
|
|
Main.gore[goreIndex].scale = 1.5f;
|
|
Main.gore[goreIndex].velocity.X = Main.gore[goreIndex].velocity.X - 1.5f;
|
|
Main.gore[goreIndex].velocity.Y = Main.gore[goreIndex].velocity.Y - 1.5f;
|
|
}
|
|
}
|
|
|
|
public override bool PreDraw(SpriteBatch spriteBatch, Color lightColor)
|
|
{
|
|
Vector2 drawOrigin = new Vector2(Main.projectileTexture[projectile.type].Width * 0.5f, projectile.height * 0.5f);
|
|
for (int k = 0; k < projectile.oldPos.Length; k++)
|
|
{
|
|
Vector2 drawPos = projectile.oldPos[k] - Main.screenPosition + drawOrigin + new Vector2(0f, projectile.gfxOffY);
|
|
Color color = projectile.GetAlpha(lightColor) * ((float)(projectile.oldPos.Length - k) / (float)projectile.oldPos.Length);
|
|
spriteBatch.Draw(Main.projectileTexture[projectile.type], drawPos, null, color, projectile.rotation, drawOrigin, projectile.scale, SpriteEffects.None, 0f);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|