Пример #1
0
        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;
            }
        }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
 public override void DoAI(CustomProjectile CurrentProjectile)
 {
     if (CurrentProjectile.hasgravity)
     {
         ApplyGravity(CurrentProjectile);
     }
 }
Пример #4
0
 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})");
        }
Пример #6
0
        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;
        }
Пример #7
0
 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);
     }
 }
Пример #8
0
 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;
 }
Пример #9
0
 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);
 }
Пример #10
0
 public virtual bool DoOnTileCollide(CustomProjectile CurrentProjectile, Vector2 oldVelocity)
 {
     //by default components have no effect on colliding with a block (just get deleted)
     return(true);
 }
Пример #11
0
 public override void DoPostInitValues(CustomProjectile CurrentProjectile)
 {
     CurrentProjectile.DamageModifierFraction += ExtraPercentageDamage;
     CurrentProjectile.SpeedModifierFraction  += ExtraSpeedPercentage;
 }
Пример #12
0
 public override void DoPreinitValues(CustomProjectile CurrentProjectile)
 {
     //no defaults like projectiles have
 }
Пример #13
0
 public virtual void DoAI(CustomProjectile CurrentProjectile)
 {
     //by default components have no AI to add
 }
Пример #14
0
 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)
 }
Пример #15
0
 public override void DoKill(CustomProjectile CurrentProjectile, int timeLeft)
 {
 }
Пример #16
0
 public virtual void DoKill(CustomProjectile CurrentProjectile, int timeLeft)
 {
     //by default components have no special effect when they are deleted
 }
Пример #17
0
 //set of helper functions to apply standard AI pieces to the components
 protected void ApplyGravity(CustomProjectile CurrentProjectile)
 {
     CurrentProjectile.projectile.velocity.Y += 0.2f;
 }
Пример #18
0
        //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
        }
Пример #19
0
 public abstract void DoDraw(CustomProjectile CurrentProjectile, SpriteBatch spriteBatch);
Пример #20
0
 public override void DoOnHitNPC(CustomProjectile CurrentProjectile, NPC target, int damage, float knockback, bool crit)
 {
     Main.PlaySound(SoundID.Item25, CurrentProjectile.projectile.position);
 }
Пример #21
0
 public override void DoOnHitNPC(CustomProjectile CurrentProjectile, NPC target, int damage, float knockback, bool crit)
 {
     CurrentProjectile.CantHitNPCS.Add(target);
 }
Пример #22
0
        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);
        }
Пример #23
0
 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
 }
Пример #24
0
 public override void DoInitValues(CustomProjectile CurrentProjectile)
 {
     CurrentProjectile.projectile.penetrate += penetrate;
     CurrentProjectile.projectile.damage    += ExtraFlatDamage;
 }
Пример #25
0
 public abstract void DoInitValues(CustomProjectile CurrentProjectile);