コード例 #1
0
        public override void CheckActive()
        {
            Player          player    = Main.player[projectile.owner];
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            if (player.dead)
            {
                modPlayer.paladinMinion = false;
            }
            if (modPlayer.paladinMinion)
            {
                projectile.timeLeft = 2;
            }
        }
コード例 #2
0
 public override void ModifyHitPlayer(Player target, ref int damage, ref bool crit)
 {
     if (target.hurtCooldowns[1] <= 0)
     {
         BluemagicPlayer modPlayer = target.GetModPlayer <BluemagicPlayer>(mod);
         modPlayer.constantDamage = 900;
         modPlayer.percentDamage  = 1.5f;
         if (Main.expertMode)
         {
             modPlayer.constantDamage = (int)(modPlayer.constantDamage * 1.5f);
             modPlayer.percentDamage *= 1.5f;
         }
     }
 }
コード例 #3
0
 public override void ModifyHitPlayer(Player target, ref int damage, ref bool crit)
 {
     if (target.hurtCooldowns[1] <= 0)
     {
         BluemagicPlayer modPlayer = target.GetModPlayer <BluemagicPlayer>();
         modPlayer.constantDamage = 100;
         modPlayer.percentDamage  = 1f / 6f;
         if (Main.expertMode)
         {
             modPlayer.constantDamage *= 2;
             modPlayer.percentDamage  *= 2f;
         }
         modPlayer.chaosDefense = true;
     }
 }
コード例 #4
0
        protected int FindHighestLife(int start = 0)
        {
            int max = start;

            for (int k = 0; k < 255; k++)
            {
                if (Main.player[k].active && !Main.player[k].dead)
                {
                    BluemagicPlayer modPlayer = Main.player[k].GetModPlayer <BluemagicPlayer>();
                    if (modPlayer.terraLives > max)
                    {
                        max = modPlayer.terraLives;
                    }
                }
            }
            return(max);
        }
コード例 #5
0
        public override void AI()
        {
            if (projectile.localAI[0] == 0f)
            {
                if (projectile.ai[0] == 1)
                {
                    projectile.coldDamage = true;
                }
                if (projectile.ai[0] == 3)
                {
                    projectile.damage = (int)(1.2f * projectile.damage);
                }
                projectile.Name       = GetName();
                projectile.localAI[0] = 1f;
            }
            Player player = Main.player[projectile.owner];

            if (!player.active || player.dead)
            {
                projectile.Kill();
                return;
            }
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            if (modPlayer.elementShields <= projectile.ai[0])
            {
                projectile.Kill();
                return;
            }
            projectile.timeLeft = 2;
            projectile.Center   = player.Center;
            if (projectile.ai[0] > 0f)
            {
                float offset   = (projectile.ai[0] - 1f) / (modPlayer.elementShields - 1);
                float rotation = modPlayer.elementShieldPos / 300f + offset;
                rotation             = (rotation % 1f) * 2f * (float)Math.PI;
                projectile.position += 160f * new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation));
                projectile.rotation  = -rotation;
            }
            LightColor();
            projectile.frame  = (int)projectile.ai[0];
            projectile.ai[1] += 1f;
            projectile.ai[1] %= 300f;
            projectile.alpha  = 75 + (int)(50 * Math.Sin(projectile.ai[1] * 2f * (float)Math.PI / 300f));
        }
コード例 #6
0
        public override void Update(Player player, ref int buffIndex)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            if (player.ownedProjectileCounts[mod.ProjectileType("SkyDragonHead")] > 0)
            {
                modPlayer.skyDragon = true;
            }
            if (!modPlayer.skyDragon)
            {
                player.DelBuff(buffIndex);
                buffIndex--;
            }
            else
            {
                player.buffTime[buffIndex] = 18000;
            }
        }
コード例 #7
0
        public override void UpdateAccessory(Player player, bool hideVisual)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            if (modPlayer.noGodmode)
            {
                player.statDefense    -= item.defense;
                modPlayer.triedGodmode = true;
            }
            else
            {
                modPlayer.godmode = true;
                if (player.endurance < 1f)
                {
                    player.endurance = 1f;
                }
            }
        }
コード例 #8
0
        public override void Update(Player player, ref int buffIndex)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            if (player.ownedProjectileCounts[mod.ProjectileType("FrostFairyWingsProj")] > 0)
            {
                modPlayer.frostFairy = true;
            }
            if (!modPlayer.frostFairy)
            {
                player.DelBuff(buffIndex);
                buffIndex--;
            }
            else
            {
                player.buffTime[buffIndex] = 18000;
            }
        }
コード例 #9
0
        public override void Update(Player player, ref int buffIndex)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(mod);

            if (player.ownedProjectileCounts[mod.ProjectileType("MiniCaptiveElement0")] > 0)
            {
                modPlayer.elementMinion = true;
            }
            if (!modPlayer.elementMinion)
            {
                player.DelBuff(buffIndex);
                buffIndex--;
            }
            else
            {
                player.buffTime[buffIndex] = 18000;
            }
        }
コード例 #10
0
        public override bool OnPickup(Item item, Player player)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(mod);

            if ((item.type == ItemID.Star || item.type == ItemID.SoulCake || item.type == ItemID.SugarPlum) && modPlayer.manaMagnet2)
            {
                Main.PlaySound(7, (int)player.position.X, (int)player.position.Y, 1);
                player.statMana += 160;
                if (Main.myPlayer == player.whoAmI)
                {
                    player.ManaEffect(160);
                }
                if (player.statMana > player.statManaMax2)
                {
                    player.statMana = player.statManaMax2;
                }
                return(false);
            }
            if ((item.type == ItemID.Heart || item.type == ItemID.CandyApple || item.type == ItemID.CandyCane) && modPlayer.lifeMagnet2)
            {
                modPlayer.CheckBadHeal();
                Main.PlaySound(7, (int)player.position.X, (int)player.position.Y, 1);
                player.statLife += 32;
                if (Main.myPlayer == player.whoAmI)
                {
                    player.HealEffect(32);
                }
                if (player.statLife > player.statLifeMax2)
                {
                    player.statLife = player.statLifeMax2;
                }
                modPlayer.StartBadHeal();
                return(false);
            }
            else if (item.type == ItemID.Heart || item.type == ItemID.CandyApple || item.type == ItemID.CandyCane)
            {
                modPlayer.CheckBadHeal();
                player.statLife += 20;
                modPlayer.StartBadHeal();
                player.statLife -= 20;
            }
            return(base.OnPickup(item, player));
        }
コード例 #11
0
        private object CallPlayerSet(Player player, string command, object arg)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            if (command == "puriumShieldChargeMax" && arg is float)
            {
                modPlayer.puriumShieldChargeMax = (float)arg;
                return(arg);
            }
            if (command == "puriumShieldChargeRate" && arg is float)
            {
                modPlayer.puriumShieldChargeRate = (float)arg;
                return(arg);
            }
            if (command == "puriumShieldEnduranceMult" && arg is float)
            {
                modPlayer.puriumShieldEnduranceMult = (float)arg;
                return(arg);
            }
            if (command == "manaMagnet2" && arg is bool)
            {
                modPlayer.manaMagnet2 = (bool)arg;
                return(arg);
            }
            if (command == "crystalCloak" && arg is bool)
            {
                modPlayer.crystalCloak = (bool)arg;
                return(arg);
            }
            if (command == "lifeMagnet2" && arg is bool)
            {
                modPlayer.lifeMagnet2 = (bool)arg;
                return(arg);
            }
            if (command == "noGodmode" && arg is bool)
            {
                modPlayer.noGodmode = (bool)arg;
                return(arg);
            }
            return(null);
        }
コード例 #12
0
 public override void AI()
 {
     projectile.localAI[0] += 1f;
     if (!Main.dedServ && projectile.localAI[0] >= 180f && projectile.localAI[0] < 480f && Main.rand.Next(10) == 0)
     {
         BluemagicPlayer modPlayer = Main.player[Main.myPlayer].GetModPlayer <BluemagicPlayer>();
         if (modPlayer.heroLives > 0)
         {
             Main.PlaySound(2, -1, -1, 14);
         }
         else
         {
             Main.PlaySound(2, (int)projectile.position.X, (int)projectile.position.Y, 14);
         }
     }
     projectile.position = NextPosition();
     if (projectile.localAI[0] >= 500f)
     {
         projectile.Kill();
     }
 }
コード例 #13
0
        private static void DrawPuriumShieldMouseOver()
        {
            if (Main.mouseText)
            {
                return;
            }
            Player player = Main.player[Main.myPlayer];

            if (player.ghost)
            {
                return;
            }
            Mod             mod       = Bluemagic.Instance;
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(mod);

            if (modPlayer.puriumShieldChargeMax <= 0f)
            {
                return;
            }

            int       screenAnchorX = Main.screenWidth / 2;
            const int barSize       = 128;
            const int barHeight     = 28;
            Rectangle rect          = new Rectangle(screenAnchorX, 32, (int)(barSize * Main.UIScale), (int)(barHeight * Main.UIScale));

            if (Main.mouseX > rect.Left && Main.mouseX < rect.Right && Main.mouseY > rect.Top && Main.mouseY < rect.Bottom)
            {
                Main.player[Main.myPlayer].showItemIcon = false;
                float  enduranceCap = (int)(20 * modPlayer.puriumShieldEnduranceMult);
                string text         = "Damaging enemies powers a purity shield around you";
                text += "\nShield also regenerates over time";
                text += "\nReduces damage by up to " + enduranceCap + "% depending on charge";
                text += "\nTaking damage consumes shield depending on damage";
                text += "\nShield can consume 50 charge to protect you from debuffs";
                text += "\nShield can consume 1,000 charge to protect you from fatal damage";
                Main.instance.MouseText(text);
                Main.mouseText = true;
            }
        }
コード例 #14
0
        private static bool DrawPuriumShieldBar()
        {
            int    anchorX = Main.screenWidth / 2;
            Player player  = Main.player[Main.myPlayer];

            if (player.ghost)
            {
                return(true);
            }
            Mod             mod       = Bluemagic.Instance;
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(mod);

            if (modPlayer.puriumShieldChargeMax <= 0f)
            {
                return(true);
            }

            const int         barSize            = 128;
            const int         padding            = 4;
            const int         chargeSize         = barSize - 2 * padding;
            const int         chargeHeight       = 20;
            DynamicSpriteFont font               = Main.fontMouseText;
            float             puriumShieldCharge = Math.Min(modPlayer.puriumShieldCharge, modPlayer.puriumShieldChargeMax);
            string            chargeText         = (int)puriumShieldCharge + "/" + (int)modPlayer.puriumShieldChargeMax;
            string            maxText            = "Purity Shield Charge: " + (int)modPlayer.puriumShieldChargeMax + "/" + (int)modPlayer.puriumShieldChargeMax;
            Vector2           maxTextSize        = font.MeasureString(maxText);
            Color             textColor          = new Color(Main.mouseTextColor, Main.mouseTextColor, Main.mouseTextColor, Main.mouseTextColor);

            Main.spriteBatch.DrawString(font, "Purity Shield Charge:", new Vector2(anchorX + barSize / 2 - maxTextSize.X / 2f, 6f), textColor, 0f, default(Vector2), 1f, SpriteEffects.None, 0f);
            Main.spriteBatch.DrawString(font, chargeText, new Vector2(anchorX + barSize / 2 + maxTextSize.X / 2f, 6f), textColor, 0f, new Vector2(font.MeasureString(chargeText).X, 0f), 1f, SpriteEffects.None, 0f);

            float fill = puriumShieldCharge / modPlayer.puriumShieldChargeMax;

            Main.spriteBatch.Draw(mod.GetTexture("PuriumShieldBar"), new Vector2(anchorX, 32f), null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
            Main.spriteBatch.Draw(mod.GetTexture("PuriumShieldCharge"), new Vector2(anchorX + padding, 32f + padding), new Rectangle(0, 0, (int)(fill * chargeSize), chargeHeight), Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);

            return(true);
        }
コード例 #15
0
        public override void Update(Player player, ref int buffIndex)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            if (modPlayer.liquified == 0)
            {
                modPlayer.liquified = 1 + Main.rand.Next(2);
            }
            else if (modPlayer.liquified < 0)
            {
                modPlayer.liquified *= -1;
            }
            if (player.width == Player.defaultWidth)
            {
                player.width       = 32;
                player.position.X -= (player.width - Player.defaultWidth) / 2f;
            }
            if (player.height == Player.defaultHeight)
            {
                player.height      = 24;
                player.position.Y += Player.defaultHeight - player.height;
            }
        }
コード例 #16
0
        public static void DrawMouseOver()
        {
            if (Main.mouseText || selected < 0)
            {
                return;
            }
            Player player = Main.player[Main.myPlayer];

            if (player.ghost)
            {
                return;
            }
            Mod             mod       = Bluemagic.Instance;
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            for (int k = 0; k < 5; k++)
            {
                if (visibleStats[k] == null)
                {
                    return;
                }
                Vector2 topLeft = GetStatOffset(k);
                if (IsMouseOver(topLeft, 372, 32))
                {
                    Main.instance.MouseText(visibleStats[k].Tooltip);
                    Main.mouseText = true;
                    return;
                }
                else if (IsMouseOver(topLeft + new Vector2(380f, 0f), 32, 32))
                {
                    Main.instance.MouseText(visibleStats[k].Inactive ? "Inactive" : "Active");
                    Main.mouseText = true;
                    return;
                }
            }
        }
コード例 #17
0
        public static void PuriumShieldChargeMax(Player player, int points)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(Bluemagic.Instance);

            modPlayer.puriumShieldChargeMax += 100 * points;
        }
コード例 #18
0
        public static void ThrownCost(Player player, int points)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(Bluemagic.Instance);

            modPlayer.thrownCost += 0.08f * points;
        }
コード例 #19
0
        public override void Behavior()
        {
            if (projectile.localAI[0] == 0f && Main.myPlayer == projectile.owner && element == 0)
            {
                for (int k = 1; k <= 5; k++)
                {
                    Projectile.NewProjectile(projectile.Center, projectile.velocity, elementToType[k], projectile.damage, projectile.knockBack, projectile.owner);
                }
                projectile.localAI[0] = 1f;
            }
            Player          player    = Main.player[projectile.owner];
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            projectile.frame = element;
            if (Main.rand.Next(4) == 0)
            {
                CreateDust();
            }
            for (int k = 0; k < 1000; k++)
            {
                Projectile other = Main.projectile[k];
                if (k != projectile.whoAmI && other.active && other.owner == projectile.owner && elementToType.Contains(other.type) && Math.Abs(projectile.position.X - other.position.X) + Math.Abs(projectile.position.Y - other.position.Y) < projectile.width)
                {
                    const float pushAway = 0.05f;
                    if (projectile.position.X < other.position.X)
                    {
                        projectile.velocity.X -= pushAway;
                    }
                    else
                    {
                        projectile.velocity.X += pushAway;
                    }
                    if (projectile.position.Y < other.position.Y)
                    {
                        projectile.velocity.Y -= pushAway;
                    }
                    else
                    {
                        projectile.velocity.Y += pushAway;
                    }
                }
            }

            if (projectile.ai[0] == 2f && Charging)
            {
                projectile.ai[1]       += 1f;
                projectile.extraUpdates = 1;
                projectile.rotation     = projectile.velocity.ToRotation() + MathHelper.Pi;
                if (projectile.ai[1] > 40f)
                {
                    projectile.ai[1]        = 1f;
                    projectile.ai[0]        = 0f;
                    projectile.extraUpdates = 0;
                    projectile.numUpdates   = 0;
                    projectile.netUpdate    = true;
                }
                else
                {
                    return;
                }
            }

            if (projectile.ai[0] != 1f)
            {
                projectile.tileCollide = true;
            }
            if (projectile.tileCollide && WorldGen.SolidTile(Framing.GetTileSafely((int)projectile.Center.X / 16, (int)projectile.Center.Y / 16)))
            {
                projectile.tileCollide = false;
            }

            float   targetDist  = 700f;
            Vector2 targetPos   = projectile.position;
            bool    hasTarget   = false;
            NPC     ownerTarget = projectile.OwnerMinionAttackTargetNPC;

            if (ownerTarget != null && ownerTarget.CanBeChasedBy(projectile))
            {
                if (Collision.CanHitLine(projectile.position, projectile.width, projectile.height, ownerTarget.position, ownerTarget.width, ownerTarget.height))
                {
                    targetDist = Vector2.Distance(ownerTarget.Center, projectile.Center);
                    targetPos  = ownerTarget.Center;
                    hasTarget  = true;
                }
            }
            if (!hasTarget)
            {
                for (int k = 0; k < 200; k++)
                {
                    NPC npc = Main.npc[k];
                    if (npc.CanBeChasedBy(projectile))
                    {
                        float distance = Vector2.Distance(npc.Center, projectile.Center);
                        if (((distance < Vector2.Distance(projectile.Center, targetPos) && distance < targetDist) || !hasTarget) && Collision.CanHitLine(projectile.position, projectile.width, projectile.height, npc.position, npc.width, npc.height))
                        {
                            targetDist = distance;
                            targetPos  = npc.Center;
                            hasTarget  = true;
                        }
                    }
                }
            }
            float leashLength = hasTarget ? 1200f : 800f;

            if (Vector2.Distance(player.Center, projectile.Center) > leashLength)
            {
                projectile.ai[0]       = 1f;
                projectile.tileCollide = false;
                projectile.netUpdate   = true;
            }

            if (hasTarget && projectile.ai[0] == 0f)
            {
                Vector2 offset = targetPos - projectile.Center;
                offset.Normalize();
                if (targetDist > 200f)
                {
                    offset *= Charging ? 8f : 6f;
                }
                else
                {
                    offset *= -4f;
                }
                projectile.velocity = (projectile.velocity * 40f + offset) / 41f;
            }
            else
            {
                float   speed    = projectile.ai[0] == 1f ? 15f : 6f;
                Vector2 offset   = player.Center - projectile.Center + new Vector2(0f, -60f);
                float   distance = offset.Length();
                if (distance > 200f && speed < 8f)
                {
                    speed = 8f;
                }
                if (distance < 150f && projectile.ai[0] == 1f && !Collision.SolidCollision(projectile.position, projectile.width, projectile.height))
                {
                    projectile.ai[0]     = 0f;
                    projectile.netUpdate = true;
                }
                if (distance > 2000f)
                {
                    projectile.position  = player.Center - new Vector2(projectile.width / 2, projectile.height / 2);
                    projectile.netUpdate = true;
                }
                if (distance > 70f)
                {
                    offset.Normalize();
                    offset *= speed;
                    projectile.velocity = (projectile.velocity * 40f + offset) / 41f;
                }
                else if (projectile.velocity.X == 0f && projectile.velocity.Y == 0f)
                {
                    projectile.velocity = new Vector2(-0.15f, -0.05f);
                }
            }

            if (Charging || !hasTarget)
            {
                projectile.rotation = projectile.velocity.ToRotation() + MathHelper.Pi;
            }
            else
            {
                projectile.rotation = (targetPos - projectile.Center).ToRotation() + MathHelper.Pi;
            }
            if (projectile.ai[1] > 0f)
            {
                projectile.ai[1] += (float)Main.rand.Next(1, 4);
            }
            if (projectile.ai[1] > 90f && !Charging)
            {
                projectile.ai[1]     = 0f;
                projectile.netUpdate = true;
            }
            if (projectile.ai[1] > 40f && Charging)
            {
                projectile.ai[1]     = 0f;
                projectile.netUpdate = true;
            }

            if (projectile.ai[0] == 0f && projectile.ai[1] == 0f && hasTarget)
            {
                projectile.ai[1] += 1f;
                if (!Charging)
                {
                    if (Main.myPlayer == projectile.owner && Collision.CanHitLine(projectile.position, projectile.width, projectile.height, targetPos, 0, 0))
                    {
                        Vector2 offset = targetPos - projectile.Center;
                        offset.Normalize();
                        offset *= 8f;
                        Projectile.NewProjectile(projectile.Center, offset, mod.ProjectileType("MiniPixelBall"), projectile.damage, 0f, Main.myPlayer, element, 0f);
                        projectile.netUpdate = true;
                    }
                }
                else if (targetDist < 500f)
                {
                    if (Main.myPlayer == projectile.owner)
                    {
                        projectile.ai[0] = 2f;
                        Vector2 offset = targetPos - projectile.Center;
                        offset.Normalize();
                        projectile.velocity  = offset * 8f;
                        projectile.netUpdate = true;
                    }
                }
            }
        }
コード例 #20
0
        public static void LifeRegen2(Player player, int points)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(Bluemagic.Instance);

            modPlayer.cancelBadRegen += 4 * points;
        }
コード例 #21
0
        public override void HandlePacket(BinaryReader reader, int whoAmI)
        {
            MessageType type = (MessageType)reader.ReadByte();

            if (type == MessageType.PuritySpirit)
            {
                PuritySpirit.PuritySpirit spirit = Main.npc[reader.ReadInt32()].modNPC as PuritySpirit.PuritySpirit;
                if (spirit != null && spirit.npc.active)
                {
                    spirit.HandlePacket(reader);
                }
            }
            else if (type == MessageType.HeroLives)
            {
                Player player = Main.player[reader.ReadInt32()];
                int    lives  = reader.ReadInt32();
                player.GetModPlayer <BluemagicPlayer>(this).heroLives = lives;
                if (lives > 0)
                {
                    NetworkText text;
                    if (lives == 1)
                    {
                        text = NetworkText.FromKey("Mods.Bluemagic.LifeLeft", player.name);
                    }
                    else
                    {
                        text = NetworkText.FromKey("Mods.Bluemagic.LivesLeft", player.name, lives);
                    }
                    NetMessage.BroadcastChatMessage(text, new Color(255, 25, 25));
                }
            }
            else if (type == MessageType.ChaosSpirit)
            {
                NPC npc = Main.npc[reader.ReadInt32()];
                if (npc.active)
                {
                    ChaosSpirit.ChaosSpirit spirit = npc.modNPC as ChaosSpirit.ChaosSpirit;
                    if (spirit != null)
                    {
                        spirit.HandlePacket(reader);
                    }
                    ChaosSpirit2 spirit2 = npc.modNPC as ChaosSpirit2;
                    if (spirit2 != null)
                    {
                        spirit2.HandlePacket(reader);
                    }
                    ChaosSpirit3 spirit3 = npc.modNPC as ChaosSpirit3;
                    if (spirit3 != null)
                    {
                        spirit3.HandlePacket(reader);
                    }
                }
            }
            else if (type == MessageType.PushChaosArm)
            {
                NPC     npc  = Main.npc[reader.ReadInt32()];
                Vector2 push = new Vector2(reader.ReadSingle(), reader.ReadSingle());
                if (npc.active)
                {
                    ChaosSpiritArm arm = npc.modNPC as ChaosSpiritArm;
                    if (arm != null)
                    {
                        arm.offset += push;
                        if (Main.netMode == 2)
                        {
                            ModPacket packet = GetPacket();
                            packet.Write((byte)MessageType.PushChaosArm);
                            packet.Write(push.X);
                            packet.Write(push.Y);
                            packet.Send(-1, whoAmI);
                        }
                    }
                }
            }
            else if (type == MessageType.TerraSpirit)
            {
                NPC npc = Main.npc[reader.ReadInt32()];
                if (npc.active)
                {
                    TerraSpirit.TerraSpirit spirit = npc.modNPC as TerraSpirit.TerraSpirit;
                    if (spirit != null)
                    {
                        spirit.HandlePacket(reader);
                    }
                }
            }
            else if (type == MessageType.TerraLives)
            {
                Player player = Main.player[reader.ReadInt32()];
                int    lives  = reader.ReadInt32();
                player.GetModPlayer <BluemagicPlayer>().terraLives = lives;
                if (lives > 0)
                {
                    NetworkText text;
                    if (lives == 1)
                    {
                        text = NetworkText.FromKey("Mods.Bluemagic.LifeLeft", player.name);
                    }
                    else
                    {
                        text = NetworkText.FromKey("Mods.Bluemagic.LivesLeft", player.name, lives);
                    }
                    NetMessage.BroadcastChatMessage(text, new Color(255, 25, 25));
                }
            }
            else if (type == MessageType.GoldBlob)
            {
                NPC   npc   = Main.npc[reader.ReadByte()];
                float value = reader.ReadByte();
                if (npc.active && npc.type == NPCType("GoldBlob"))
                {
                    npc.localAI[0] = value;
                }
            }
            else if (type == MessageType.ExtraLives)
            {
                BluemagicPlayer player = Main.player[Main.myPlayer].GetModPlayer <BluemagicPlayer>();
                if (player.terraLives > 0)
                {
                    player.terraLives += 3;
                }
            }
            else if (type == MessageType.BulletNegative)
            {
                NPC npc = Main.npc[reader.ReadByte()];
                if (npc.active && npc.type == NPCType("TerraSpirit2") && npc.modNPC is TerraSpirit2)
                {
                    var bullets = ((TerraSpirit2)npc.modNPC).bullets;
                    int count   = reader.ReadByte();
                    for (int k = 0; k < count; k++)
                    {
                        bullets.Add(new BulletNegative(reader.ReadVector2(), reader.ReadVector2()));
                    }
                }
            }
            else if (type == MessageType.CustomStats)
            {
                byte            byte1     = reader.ReadByte();
                byte            byte2     = reader.ReadByte();
                Player          player    = Main.player[byte1];
                BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();
                CustomStats     stats     = byte2 == 0 ? modPlayer.chaosStats : modPlayer.cataclysmStats;
                stats.NetReceive(reader);
                if (Main.netMode == 2)
                {
                    ModPacket packet = GetPacket(512);
                    packet.Write(byte1);
                    packet.Write(byte2);
                    stats.NetSend(packet);
                    packet.Send(-1, whoAmI);
                }
            }
        }
コード例 #22
0
        public static void PuriumShieldFillRate(Player player, int points)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(Bluemagic.Instance);

            modPlayer.puriumShieldChargeRate += 0.1f * points;
        }
コード例 #23
0
        public static void PuriumShieldEnduranceMult(Player player, int points)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(Bluemagic.Instance);

            modPlayer.puriumShieldEnduranceMult += 0.1f * points;
        }
コード例 #24
0
        public override bool CanUseItem(Player player)
        {
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            return(player.extraAccessory && !modPlayer.extraAccessory2);
        }
コード例 #25
0
        public override void AI()
        {
            if (projectile.velocity.X != 0f)
            {
                projectile.localAI[0] = projectile.velocity.X == -1f ? 0f : projectile.velocity.X;
                projectile.velocity.X = 0f;
            }
            if (projectile.velocity.Y != 0f)
            {
                projectile.localAI[1] = projectile.velocity.Y;
                projectile.velocity.Y = 0f;
            }
            if (projectile.knockBack != 0f)
            {
                maxTimer             = (int)projectile.knockBack;
                projectile.knockBack = 0f;
            }
            if (timer < 0)
            {
                projectile.alpha = -timer * 3;
            }
            else
            {
                projectile.alpha   = 0;
                projectile.hostile = true;
            }
            if (projectile.localAI[0] != 255f)
            {
                Player player = Main.player[(int)projectile.localAI[0]];
                if (!player.active || player.dead)
                {
                    projectile.localAI[0] = 255f;
                }
            }
            Vector2 center = new Vector2(projectile.ai[0], projectile.ai[1]);

            if (timer < 0 && projectile.localAI[0] != 255f)
            {
                Vector2 newCenter = Main.player[(int)projectile.localAI[0]].Center;
                projectile.position += newCenter - center;
                projectile.ai[0]     = newCenter.X;
                projectile.ai[1]     = newCenter.Y;
                center = newCenter;
            }
            float rotateSpeed = 2f * (float)Math.PI / 60f / 4f * projectile.localAI[1];

            if (timer < maxTimer)
            {
                projectile.Center = projectile.Center.RotatedBy(rotateSpeed, center);
            }
            else
            {
                Vector2 offset = projectile.Center - center;
                offset.Normalize();
                offset           *= radius * ((float)strikeTime + maxTimer - timer) / (float)strikeTime;
                projectile.Center = center + offset;
            }
            if (timer == maxTimer)
            {
                BluemagicPlayer modPlayer = Main.player[Main.myPlayer].GetModPlayer <BluemagicPlayer>();
                if (modPlayer.heroLives > 0)
                {
                    Main.PlaySound(2, -1, -1, 12);
                }
                else
                {
                    Main.PlaySound(2, (int)projectile.Center.X, (int)projectile.Center.Y, 12);
                }
                projectile.hostile = true;
            }
            if (timer >= maxTimer + strikeTime)
            {
                projectile.Kill();
            }
            timer++;
            projectile.rotation       += rotateSpeed * -5f * projectile.localAI[1];
            projectile.spriteDirection = projectile.localAI[1] < 0 ? -1 : 1;
            if (projectile.frame < 4)
            {
                projectile.frameCounter++;
                if (projectile.frameCounter >= 8)
                {
                    projectile.frameCounter = 0;
                    projectile.frame++;
                    projectile.frame %= 4;
                }
            }
        }
コード例 #26
0
        public override void Behavior()
        {
            Player          player    = Main.player[projectile.owner];
            BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>();

            if (projectile.ai[1] > 0)
            {
                projectile.ai[1]--;
            }
            bool moveLeft         = false;
            bool moveRight        = false;
            int  targetFollowDist = 40 * (projectile.minionPos + 1) * player.direction;

            if (player.position.X + (float)(player.width / 2) < projectile.position.X + (float)(projectile.width / 2) + (float)targetFollowDist - 10f)
            {
                moveLeft = true;
            }
            else if (player.position.X + (float)(player.width / 2) > projectile.position.X + (float)(projectile.width / 2) + (float)targetFollowDist + 10f)
            {
                moveRight = true;
            }
            if (!Throwing())
            {
                int flyDistance = 500 + 40 * projectile.minionPos;
                if (player.rocketDelay2 > 0)
                {
                    projectile.ai[0]     = 1f;
                    projectile.netUpdate = true;
                }
                Vector2 projCenter = new Vector2(projectile.position.X + (float)projectile.width * 0.5f, projectile.position.Y + (float)projectile.height * 0.5f);
                float   xDist      = player.position.X + (float)(player.width / 2) - projCenter.X;
                float   yDist      = player.position.Y + (float)(player.height / 2) - projCenter.Y;
                float   distance   = (float)System.Math.Sqrt((double)(xDist * xDist + yDist * yDist));
                if (distance > 2000f)
                {
                    projectile.position.X = player.position.X + (float)(player.width / 2) - (float)(projectile.width / 2);
                    projectile.position.Y = player.position.Y + (float)(player.height / 2) - (float)(projectile.height / 2);
                }
                else if (distance > (float)flyDistance || System.Math.Abs(yDist) > 300f)
                {
                    if (yDist > 0f && projectile.velocity.Y < 0f)
                    {
                        projectile.velocity.Y = 0f;
                    }
                    if (yDist < 0f && projectile.velocity.Y > 0f)
                    {
                        projectile.velocity.Y = 0f;
                    }
                    projectile.ai[0]     = 1f;
                    projectile.netUpdate = true;
                }
            }
            if (Throwing())
            {
                UpdateFrame();
                projectile.velocity.X = 0f;
            }
            else if (projectile.ai[0] != 0f)
            {
                projectile.tileCollide = false;
                Vector2 projCenter = new Vector2(projectile.position.X + (float)projectile.width * 0.5f, projectile.position.Y + (float)projectile.height * 0.5f);
                float   moveDistX  = player.position.X + (float)(player.width / 2) - projCenter.X - (float)(40 * player.direction);
                float   viewRange  = 600f;
                bool    aggro      = false;
                for (int k = 0; k < 200; k++)
                {
                    if (Main.npc[k].CanBeChasedBy(this))
                    {
                        float monsterX = Main.npc[k].position.X + (float)(Main.npc[k].width / 2);
                        float monsterY = Main.npc[k].position.Y + (float)(Main.npc[k].height / 2);
                        float distance = System.Math.Abs(player.position.X + (float)(player.width / 2) - monsterX) + System.Math.Abs(player.position.Y + (float)(player.height / 2) - monsterY);
                        if (distance < viewRange)
                        {
                            aggro = true;
                            break;
                        }
                    }
                }
                if (!aggro)
                {
                    moveDistX -= (float)(40 * projectile.minionPos * player.direction);
                }
                float moveDistY = player.position.Y + (float)(player.height / 2) - projCenter.Y;
                float moveDist  = (float)System.Math.Sqrt((double)(moveDistX * moveDistX + moveDistY * moveDistY));
                float maxSpeed  = 10f;
                if (moveDist < 200f && player.velocity.Y == 0f && projectile.position.Y + (float)projectile.height <= player.position.Y + (float)player.height && !Collision.SolidCollision(projectile.position, projectile.width, projectile.height))
                {
                    projectile.ai[0] = 0f;
                    if (projectile.velocity.Y < -6f)
                    {
                        projectile.velocity.Y = -6f;
                    }
                    projectile.netUpdate = true;
                }
                if (moveDist < 60f)
                {
                    moveDistX = projectile.velocity.X;
                    moveDistY = projectile.velocity.Y;
                }
                else
                {
                    moveDist   = maxSpeed / moveDist;
                    moveDistX *= moveDist;
                    moveDistY *= moveDist;
                }
                float acceleration = 0.2f;
                if (projectile.velocity.X < moveDistX)
                {
                    projectile.velocity.X += acceleration;
                    if (projectile.velocity.X < 0f)
                    {
                        projectile.velocity.X += acceleration * 1.5f;
                    }
                }
                if (projectile.velocity.X > moveDistX)
                {
                    projectile.velocity.X -= acceleration;
                    if (projectile.velocity.X > 0f)
                    {
                        projectile.velocity.X -= acceleration * 1.5f;
                    }
                }
                if (projectile.velocity.Y < moveDistY)
                {
                    projectile.velocity.Y += acceleration;
                    if (projectile.velocity.Y < 0f)
                    {
                        projectile.velocity.Y += acceleration * 1.5f;
                    }
                }
                if (projectile.velocity.Y > moveDistY)
                {
                    projectile.velocity.Y -= acceleration;
                    if (projectile.velocity.Y > 0f)
                    {
                        projectile.velocity.Y -= acceleration * 1.5f;
                    }
                }
                if ((double)projectile.velocity.X > 0.5)
                {
                    projectile.spriteDirection = -1;
                }
                else if ((double)projectile.velocity.X < -0.5)
                {
                    projectile.spriteDirection = 1;
                }
                UpdateFrame();
                if (Main.rand.Next(3) == 0)
                {
                    int dust = Dust.NewDust(projectile.position, projectile.width, projectile.height, mod.DustType("SpectreDust"));
                    Main.dust[dust].velocity /= 2f;
                }
            }
            else
            {
                float separation = (float)(40 * projectile.minionPos);
                if (true)
                {
                    float moveToX   = projectile.position.X;
                    float moveToY   = projectile.position.Y;
                    float moveDist  = 100000f;
                    int   attacking = -1;
                    if (projectile.OwnerMinionAttackTargetNPC != null && projectile.OwnerMinionAttackTargetNPC.CanBeChasedBy(this))
                    {
                        NPC npc = projectile.OwnerMinionAttackTargetNPC;
                        moveToX   = npc.Center.X;
                        moveToY   = npc.Center.Y;
                        moveDist  = Vector2.Distance(npc.Center, projectile.Center);
                        attacking = npc.whoAmI;
                    }
                    else
                    {
                        float closestDist = moveDist;
                        for (int k = 0; k < 200; k++)
                        {
                            if (Main.npc[k].CanBeChasedBy(this))
                            {
                                float monsterX    = Main.npc[k].position.X + (float)(Main.npc[k].width / 2);
                                float monsterY    = Main.npc[k].position.Y + (float)(Main.npc[k].height / 2);
                                float monsterDist = System.Math.Abs(projectile.position.X + (float)(projectile.width / 2) - monsterX) + System.Math.Abs(projectile.position.Y + (float)(projectile.height / 2) - monsterY);
                                if (monsterDist < moveDist)
                                {
                                    if (attacking == -1 && monsterDist <= closestDist)
                                    {
                                        closestDist = monsterDist;
                                        moveToX     = monsterX;
                                        moveToY     = monsterY;
                                    }
                                    if (Collision.CanHit(projectile.position, projectile.width, projectile.height, Main.npc[k].position, Main.npc[k].width, Main.npc[k].height))
                                    {
                                        moveDist  = monsterDist;
                                        moveToX   = monsterX;
                                        moveToY   = monsterY;
                                        attacking = k;
                                    }
                                }
                            }
                        }
                        if (attacking == -1 && closestDist < moveDist)
                        {
                            moveDist = closestDist;
                        }
                    }
                    if (attacking >= 0 && moveDist < 1000f)
                    {
                        projectile.friendly = true;
                        if (projectile.ai[1] == 0 && projectile.owner == Main.myPlayer)
                        {
                            Vector2 throwSpeed = new Vector2(moveToX, moveToY) - projectile.Center;
                            if (throwSpeed != Vector2.Zero)
                            {
                                throwSpeed.Normalize();
                                throwSpeed *= 10f;
                            }
                            Projectile.NewProjectile(projectile.Center.X, projectile.Center.Y, throwSpeed.X, throwSpeed.Y, mod.ProjectileType("MiniHammer"), projectile.damage, projectile.knockBack, projectile.owner);
                            if (moveToX < projectile.Center.X)
                            {
                                projectile.direction = -1;
                            }
                            else if (moveToX > projectile.Center.X)
                            {
                                projectile.direction = 1;
                            }
                            projectile.ai[1]     = 100;
                            projectile.netUpdate = true;
                        }
                    }
                    else
                    {
                        projectile.friendly = false;
                    }
                }
                projectile.rotation    = 0f;
                projectile.tileCollide = true;
                float increment = 0.2f;
                float maxSpeed  = 3f;
                if (maxSpeed < System.Math.Abs(player.velocity.X) + System.Math.Abs(player.velocity.Y))
                {
                    increment = 0.3f;
                }
                if (moveLeft)
                {
                    projectile.velocity.X -= increment;
                }
                else if (moveRight)
                {
                    projectile.velocity.X += increment;
                }
                else
                {
                    projectile.velocity.X *= 0.8f;
                    if (projectile.velocity.X >= -increment && projectile.velocity.X <= increment)
                    {
                        projectile.velocity.X = 0f;
                    }
                }
                bool willCollide = false;
                if (moveLeft || moveRight)
                {
                    int checkX = (int)(projectile.position.X + (float)(projectile.width / 2)) / 16;
                    int checkY = (int)(projectile.position.Y + (float)(projectile.height / 2)) / 16;
                    if (moveLeft)
                    {
                        checkX--;
                    }
                    if (moveRight)
                    {
                        checkX++;
                    }
                    checkX += (int)projectile.velocity.X;
                    if (WorldGen.SolidTile(checkX, checkY))
                    {
                        willCollide = true;
                    }
                }
                bool playerBelow = player.position.Y + (float)player.height - 8f > projectile.position.Y + (float)projectile.height;
                Collision.StepUp(ref projectile.position, ref projectile.velocity, projectile.width, projectile.height, ref projectile.stepSpeed, ref projectile.gfxOffY, 1, false);
                if (projectile.velocity.Y == 0f)
                {
                    if (!playerBelow && (projectile.velocity.X != 0f))
                    {
                        int checkX = (int)(projectile.position.X + (float)(projectile.width / 2)) / 16;
                        int checkY = (int)(projectile.position.Y + (float)(projectile.height / 2)) / 16 + 1;
                        if (moveLeft)
                        {
                            checkX--;
                        }
                        if (moveRight)
                        {
                            checkX++;
                        }
                        WorldGen.SolidTile(checkX, checkY);
                    }
                    if (willCollide)
                    {
                        int checkX = (int)(projectile.position.X + (float)(projectile.width / 2)) / 16;
                        int checkY = (int)(projectile.position.Y + (float)projectile.height) / 16 + 1;
                        if (WorldGen.SolidTile(checkX, checkY) || Main.tile[checkX, checkY].halfBrick() || Main.tile[checkX, checkY].slope() > 0)
                        {
                            try
                            {
                                checkY--;
                                if (moveLeft)
                                {
                                    checkX--;
                                }
                                if (moveRight)
                                {
                                    checkX++;
                                }
                                checkX += (int)projectile.velocity.X;
                                if (!WorldGen.SolidTile(checkX, checkY - 1) && !WorldGen.SolidTile(checkX, checkY - 2))
                                {
                                    projectile.velocity.Y = -5.1f;
                                }
                                else
                                {
                                    projectile.velocity.Y = -7.1f;
                                }
                            }
                            catch
                            {
                                projectile.velocity.Y = -7.1f;
                            }
                        }
                    }
                    else if (!projectile.friendly && player.position.Y + player.height + 80f < projectile.position.Y)
                    {
                        projectile.velocity.Y = -7f;
                    }
                }
                if (projectile.velocity.X > maxSpeed)
                {
                    projectile.velocity.X = maxSpeed;
                }
                if (projectile.velocity.X < -maxSpeed)
                {
                    projectile.velocity.X = -maxSpeed;
                }
                if (projectile.velocity.X < 0f)
                {
                    projectile.direction = -1;
                }
                if (projectile.velocity.X > 0f)
                {
                    projectile.direction = 1;
                }
                if (projectile.velocity.X != 0f || Throwing())
                {
                    projectile.spriteDirection = -projectile.direction;
                }
                UpdateFrame();
                if (projectile.wet)
                {
                    projectile.velocity   *= 0.9f;
                    projectile.velocity.Y += 0.2f;
                }
                else
                {
                    projectile.velocity.Y += 0.4f;
                }
                if (projectile.velocity.Y > 10f)
                {
                    projectile.velocity.Y = 10f;
                }
            }
        }