using Microsoft.Xna.Framework; using Terraria; namespace Decimation.Content.Projectiles { internal class TitanicPikeProjectile : DecimationProjectile { protected override void Init() { projectile.width = 88; projectile.height = 88; projectile.aiStyle = 19; projectile.penetrate = -1; projectile.scale = 1.3f; projectile.alpha = 0; projectile.hide = true; projectile.ownerHitCheck = true; projectile.tileCollide = false; } public float movementFactor // Change this value to alter how fast the spear moves { get { return projectile.ai[0]; } set { projectile.ai[0] = value; } } public override void AI() { // Since we access the owner player instance so much, it's useful to create a helper local variable for this // Sadly, Projectile/ModProjectile does not have its own Player projOwner = Main.player[projectile.owner]; // Here we set some of the projectile's owner properties, such as held item and itemtime, along with projectile direction and position based on the player Vector2 ownerMountedCenter = projOwner.RotatedRelativePoint(projOwner.MountedCenter, true); projectile.direction = projOwner.direction; projOwner.heldProj = projectile.whoAmI; projOwner.itemTime = projOwner.itemAnimation; projectile.position.X = ownerMountedCenter.X - (float)(projectile.width / 2); projectile.position.Y = ownerMountedCenter.Y - (float)(projectile.height / 2); // As long as the player isn't frozen, the spear can move if (!projOwner.frozen) { if (movementFactor == 0f) // When initially thrown out, the ai0 will be 0f { movementFactor = 3f; // Make sure the spear moves forward when initially thrown out projectile.netUpdate = true; // Make sure to netUpdate this spear } if (projOwner.itemAnimation < projOwner.itemAnimationMax / 3) // Somewhere along the item animation, make sure the spear moves back { movementFactor -= 2.4f; } else // Otherwise, increase the movement factor { movementFactor += 2.1f; } } // Change the spear position based off of the velocity and the movementFactor projectile.position += projectile.velocity * movementFactor; // When we reach the end of the animation, we can kill the spear projectile if (projOwner.itemAnimation == 0) { projectile.Kill(); } // Apply proper rotation, with an offset of 135 degrees due to the sprite's rotation, notice the usage of MathHelper, use this class! // MathHelper.ToRadians(xx degrees here) projectile.rotation = projectile.velocity.ToRotation() + MathHelper.ToRadians(135f); // Offset by 90 degrees here if (projectile.spriteDirection == -1) { projectile.rotation -= MathHelper.ToRadians(90f); } } } }