public override void DoAI(CustomProjectile CurrentProjectile) { bool target = false; Vector2 move = Vector2.Zero; float distance = 400f; //this defines how far the projectile will track the closest enemy double direction = 0; for (int k = 0; k < 200; k++) { if (Main.npc[k].active && !Main.npc[k].dontTakeDamage && !Main.npc[k].friendly && Main.npc[k].lifeMax > 5) { Vector2 newMove = Main.npc[k].Center - CurrentProjectile.projectile.Center; float distanceTo = (float)Math.Sqrt(newMove.X * newMove.X + newMove.Y * newMove.Y); if (distanceTo < distance) { move = newMove; distance = distanceTo; direction = Math.Atan2((double)(Main.npc[k].Center.Y - CurrentProjectile.projectile.Center.Y), (double)(Main.npc[k].Center.X - CurrentProjectile.projectile.Center.X)); target = true; } } } if (target) { move.Normalize(); CurrentProjectile.projectile.velocity = CurrentProjectile.projectile.velocity + move * 0.5f; } }
public void Shoot(Player player, ref Vector2 position, ref float speedX, ref float speedY, ref int type, ref int damage, ref float knockBack) { if (ReadyToUse) { double AimAngle = Math.Atan2(speedX, speedY); for (int i = 0; i < projectilelist.Count; i++) { double projectileangle = (Main.rand.NextDouble() - 0.5f) * spreadangle + AimAngle; //preinitializes stuff that is needed prior to the projectile being created in the world (starting speed is biggest one) projectilelist[i].preinitalize(); //creates an instance of the projectile in the world Projectile projectile = Main.projectile[Projectile.NewProjectile( position.X, position.Y, (float)(projectilelist[i].speed * Math.Sin(projectileangle)), (float)(projectilelist[i].speed * Math.Cos(projectileangle)), ProjectileType <CustomProjectile>(), 0, 0, player.whoAmI)]; //edits that projectile to match the projectile in the list CustomProjectile currentproj = (CustomProjectile)projectile.modProjectile; currentproj.cloneTarget(projectilelist[i]); //initializes and postinitializes to build the stats for the projectile currentproj.initialize(); currentproj.postInitialize(damage / WandAbstract.BASEDAMAGEFORMODIFIER, knockBack / WandAbstract.BASEKNOCKBACKFORMODIFIER); } } }
public override void DoAI(CustomProjectile CurrentProjectile) { if (CurrentProjectile.hasgravity) { ApplyGravity(CurrentProjectile); } }
public override void DoInitValues(CustomProjectile CurrentProjectile) { CurrentProjectile.projectile.width = width; CurrentProjectile.projectile.height = height; CurrentProjectile.projectile.friendly = friendly; CurrentProjectile.projectile.penetrate += penetrate; CurrentProjectile.projectile.timeLeft += timeLeft; CurrentProjectile.projectile.damage += item.damage; CurrentProjectile.bounces += bounces; CurrentProjectile.projectile.magic = item.magic; }
public static void GenerateProjectile(CustomProjectile projInfo) { if (Enum.IsDefined(typeof(ProjectileType), projInfo.ID)) { Logger.Error($"ProjectileID Conflict with Official ID!, ProjID: {projInfo.ID}"); return; } if (_ProjectilePrefabs.ContainsKey(projInfo.ID)) { Logger.Error($"ProjectileID Conflict!, ProjID: {projInfo.ID}"); return; } if (!Enum.IsDefined(typeof(ProjectileType), projInfo.BaseProjectile)) { Logger.Error($"BaseProjectile should be one of the from official!, ProjID: {projInfo.ID}"); return; } var basePrefab = ProjectileManager.Current.m_projectilePrefabs[(int)projInfo.BaseProjectile]; var newPrefab = GameObject.Instantiate(basePrefab); UnityEngine.Object.DontDestroyOnLoad(newPrefab); var projectileBase = newPrefab.GetComponent <ProjectileBase>(); if (projectileBase != null) { projectileBase.m_maxDamage = projInfo.Damage.GetAbsValue(PlayerData.MaxHealth, projectileBase.m_maxDamage); projectileBase.m_maxInfection = projInfo.Infection.GetAbsValue(PlayerData.MaxInfection, projectileBase.m_maxInfection); var targeting = projectileBase.TryCast <ProjectileTargeting>(); if (targeting != null) { targeting.Speed = projInfo.Speed.GetAbsValue(targeting.Speed); targeting.TargetStrength = projInfo.HomingStrength.GetAbsValue(targeting.TargetStrength); targeting.LightColor = projInfo.GlowColor; targeting.LightRange = projInfo.GlowRange.GetAbsValue(targeting.LightRange); } else { Logger.Warning($"ProjectileBase is not a ProjectileTargeting, Ignore few settings, ProjID: {projInfo.ID}, Name: {projInfo.DebugName}"); } } else { Logger.Error($"Projectile Base Prefab Doesn't have ProjectileBase, Are you sure?, ProjID: {projInfo.ID}, Name: {projInfo.DebugName}"); } newPrefab.SetActive(false); newPrefab.name = "GeneratedProjectilePrefab_" + projInfo.ID; _ProjectilePrefabs.Add(projInfo.ID, newPrefab); Logger.Debug($"Added Projectile!: {projInfo.ID} ({projInfo.DebugName})"); }
public override void DoAI(CustomProjectile CurrentProjectile) { CurrentProjectile.projectile.velocity = CurrentProjectile.projectile.velocity * 0.99f; Color color = Color.Red; Vector2 direction = new Vector2((float)Math.Cos(CurrentProjectile.projectile.rotation), (float)Math.Sin(CurrentProjectile.projectile.rotation)); Vector2 center = CurrentProjectile.projectile.Center; float angle = CurrentProjectile.projectile.rotation; float speed = (float)Main.rand.NextDouble() * 2.6f + 1f; Vector2 velocity = speed * new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)); int dust = Dust.NewDust(center, 0, 0, 267, velocity.X, velocity.Y, 0, color, 1.2f); Main.dust[dust].noGravity = true; }
public override bool DoOnTileCollide(CustomProjectile CurrentProjectile, Vector2 oldVelocity) { CurrentProjectile.bounces--; if (CurrentProjectile.bounces <= 0) { return(true); } else { if (CurrentProjectile.projectile.velocity.X != oldVelocity.X) { CurrentProjectile.projectile.velocity.X = -oldVelocity.X; } if (CurrentProjectile.projectile.velocity.Y != oldVelocity.Y) { CurrentProjectile.projectile.velocity.Y = -oldVelocity.Y; } CurrentProjectile.projectile.velocity *= 0.75f; Main.PlaySound(SoundID.Item10, CurrentProjectile.projectile.position); return(false); } }
public override void DoPreinitValues(CustomProjectile CurrentProjectile) { //stuff that needs to be added to the projectile prior to it existing in space //only parameters of CustomProjectile no projectile stuff CurrentProjectile.speed = projspeed; }
public override void DoDraw(CustomProjectile CurrentProjectile, SpriteBatch spriteBatch) { spriteBatch.Draw(GFX.GFX.SPARKBOLT, CurrentProjectile.projectile.position - Main.screenPosition - new Vector2((float)(12 * Math.Cos(CurrentProjectile.angle)), (float)(12 * Math.Sin(CurrentProjectile.angle))), null, Color.White, CurrentProjectile.angle, Vector2.Zero, CurrentProjectile.projectile.scale, SpriteEffects.None, 0f); }
public virtual bool DoOnTileCollide(CustomProjectile CurrentProjectile, Vector2 oldVelocity) { //by default components have no effect on colliding with a block (just get deleted) return(true); }
public override void DoPostInitValues(CustomProjectile CurrentProjectile) { CurrentProjectile.DamageModifierFraction += ExtraPercentageDamage; CurrentProjectile.SpeedModifierFraction += ExtraSpeedPercentage; }
public override void DoPreinitValues(CustomProjectile CurrentProjectile) { //no defaults like projectiles have }
public virtual void DoAI(CustomProjectile CurrentProjectile) { //by default components have no AI to add }
public virtual void DoOnHitNPC(CustomProjectile CurrentProjectile, NPC target, int damage, float knockback, bool crit) { //by default components have no special effect on colliding with an NPC (deal damage and get deleted) }
public override void DoKill(CustomProjectile CurrentProjectile, int timeLeft) { }
public virtual void DoKill(CustomProjectile CurrentProjectile, int timeLeft) { //by default components have no special effect when they are deleted }
//set of helper functions to apply standard AI pieces to the components protected void ApplyGravity(CustomProjectile CurrentProjectile) { CurrentProjectile.projectile.velocity.Y += 0.2f; }
//used for stuff like adding the actual projectile or dusts //every projectilecomponent REQUIRED TO override this //modifiercomponents optional public virtual void DoPostInitValues(CustomProjectile customProjectile) { //do nothing }
public abstract void DoDraw(CustomProjectile CurrentProjectile, SpriteBatch spriteBatch);
public override void DoOnHitNPC(CustomProjectile CurrentProjectile, NPC target, int damage, float knockback, bool crit) { Main.PlaySound(SoundID.Item25, CurrentProjectile.projectile.position); }
public override void DoOnHitNPC(CustomProjectile CurrentProjectile, NPC target, int damage, float knockback, bool crit) { CurrentProjectile.CantHitNPCS.Add(target); }
public override void DoDraw(CustomProjectile CurrentProjectile, SpriteBatch spriteBatch) { // spriteBatch.Draw(GFX.GFX.BOUNCINGBOLT, CurrentProjectile.projectile.position, CurrentProjectile.projectile.getRect(), Color.White, CurrentProjectile.angle, Vector2.Zero, CurrentProjectile.projectile.scale, SpriteEffects.None, 0f); spriteBatch.Draw(GFX.GFX.BOUNCINGBOLT, CurrentProjectile.projectile.position - Main.screenPosition - new Vector2(2, 2), null, Color.White, 0f, Vector2.Zero, CurrentProjectile.projectile.scale, SpriteEffects.None, 0f); }
public override void DoDraw(CustomProjectile CurrentProjectile, SpriteBatch spriteBatch) { //default nothing for modifiers since they don't all need to have art connected with them (like the multicasts etc) //but they can if they add dusts or light or something }
public override void DoInitValues(CustomProjectile CurrentProjectile) { CurrentProjectile.projectile.penetrate += penetrate; CurrentProjectile.projectile.damage += ExtraFlatDamage; }
public abstract void DoInitValues(CustomProjectile CurrentProjectile);