示例#1
0
 public void Detonate()
 {
     if (Detonated)
     {
         return;
     }
     projectile.scale   *= 4;
     projectile.damage  *= 2;
     this.Detonated      = true;
     projectile.velocity = Vector2.Zero;
     Frame = 9;
     projectile.timeLeft = 180;
     if (ProjMod.IsGuardianProjectile(projectile.whoAmI))
     {
         TerraGuardian tg             = ProjMod.GuardianProj[projectile.whoAmI];
         Rectangle     ExplosionRange = new Rectangle((int)projectile.position.X - (int)(48 * projectile.scale), (int)projectile.position.Y - (int)(48 * projectile.scale)
                                                      , (int)(96 * projectile.scale), (int)(96 * projectile.scale));
         for (int t = 0; t < 255; t++)
         {
             if (Main.player[t].active && tg.IsPlayerHostile(Main.player[t]) && Main.player[t].getRect().Intersects(ExplosionRange))
             {
                 double dmg = Main.player[t].Hurt(Terraria.DataStructures.PlayerDeathReason.ByCustomReason(" didn't survived a electric explosion."), projectile.damage, projectile.direction, true);
                 if (dmg > 0)
                 {
                     Main.player[t].AddBuff(Terraria.ID.BuffID.Electrified, 5 * 60);
                 }
             }
             if (t < 200 && Main.npc[t].active && tg.IsNpcHostile(Main.npc[t]) && !Main.npc[t].dontTakeDamage && Main.npc[t].getRect().Intersects(ExplosionRange))
             {
                 double dmg = Main.npc[t].StrikeNPC(projectile.damage, projectile.knockBack, projectile.direction);
                 if (dmg > 0)
                 {
                     Main.npc[t].AddBuff(Terraria.ID.BuffID.Electrified, 5 * 60);
                 }
             }
         }
         foreach (TerraGuardian othertg in MainMod.ActiveGuardians.Values)
         {
             if (tg.IsGuardianHostile(othertg) && othertg.HitBox.Intersects(ExplosionRange))
             {
                 int dmg = othertg.Hurt(projectile.damage, projectile.direction, false, false, " didn't survived a electric explosion.");
                 if (dmg > 0)
                 {
                     othertg.AddBuff(Terraria.ID.BuffID.Electrified, 5 * 60);
                 }
             }
         }
     }
     projectile.friendly = projectile.hostile = false;
 }
示例#2
0
        public bool IsFriendly(TerraGuardian guardian)
        {
            switch (CharType)
            {
            case TerraGuardian.TargetTypes.Player:
                return(!guardian.IsPlayerHostile(Main.player[MyPosition]));

            case TerraGuardian.TargetTypes.Npc:
                return(!guardian.IsNpcHostile(Main.npc[MyPosition]));

            case TerraGuardian.TargetTypes.Guardian:
                return(!guardian.IsGuardianHostile(MainMod.ActiveGuardians[MyPosition]));
            }
            return(false);
        }
示例#3
0
        public override void Update(TerraGuardian guardian)
        {
            bool TargetIsKod = true;

            if (guardian.UsingFurniture)
            {
                guardian.LeaveFurniture(true);
            }
            if (CarriedPlayer != null)
            {
                PlayerMod pm = CarriedPlayer.GetModPlayer <PlayerMod>();
                TargetIsKod = pm.KnockedOut;
                if (CarriedPlayer.dead)
                {
                    InUse = false;
                    if (guardian.TargetID != -1)
                    {
                        guardian.CheckIfSomeoneNeedsPickup();
                    }
                    return;
                }
                bool BeingCarriedByMe = false;
                if (!PlayerMod.IsBeingCarriedBySomeone(CarriedPlayer) || (BeingCarriedByMe = PlayerMod.IsBeingCarriedByThisGuardian(CarriedPlayer, guardian)))
                {
                    pm.CarriedByGuardianID    = guardian.WhoAmID;
                    pm.BeingCarriedByGuardian = false;
                    if (!BeingCarriedByMe)
                    {
                        guardian.SaySomething(guardian.GetMessage(GuardianBase.MessageIDs.RescueComingMessage));
                    }
                }
                else
                {
                    InUse = false;
                    return;
                }
                if (CarriedPlayer.whoAmI == guardian.OwnerPos)
                {
                    guardian.StuckTimer = 0;
                }
            }
            else
            {
                TargetIsKod = CarriedGuardian.KnockedOut;
                if (CarriedGuardian.Downed)
                {
                    InUse = false;
                    return;
                }
                bool BeingCarriedByMe = false;
                if (!CarriedGuardian.IsBeingCarriedBySomeone() || (BeingCarriedByMe = CarriedGuardian.IsBeingCarriedByThisGuardian(guardian)))
                {
                    CarriedGuardian.CarriedByGuardianID    = guardian.WhoAmID;
                    CarriedGuardian.BeingCarriedByGuardian = false;
                    if (!BeingCarriedByMe)
                    {
                        guardian.SaySomething(guardian.GetMessage(GuardianBase.MessageIDs.RescueComingMessage));
                    }
                }
                else
                {
                    InUse = false;
                    return;
                }
            }
            if (!Carrying)
            {
                float TargetX = CarriedPlayer != null ? CarriedPlayer.Center.X : CarriedGuardian.Position.X;
                float TargetY = CarriedPlayer != null ? CarriedPlayer.Bottom.Y : CarriedGuardian.Position.Y;
                if (Math.Abs(guardian.Position.X - TargetX) < 16 && Math.Abs(guardian.Position.Y - TargetY) < guardian.Height * 0.5f)
                {
                    Carrying = true;
                    guardian.SaySomething(guardian.GetMessage(GuardianBase.MessageIDs.RescueGotMessage));
                    ChangeStep();
                }
                else
                {
                    IgnoreCombat       = true;
                    guardian.MoveRight = guardian.MoveLeft = false;
                    if (TargetX < guardian.Position.X)
                    {
                        guardian.MoveLeft = true;
                    }
                    else
                    {
                        guardian.MoveRight = true;
                    }
                    if (Time >= 5 * 60)
                    {
                        guardian.Position = new Microsoft.Xna.Framework.Vector2(TargetX, TargetY);
                        guardian.SetFallStart();
                        Carrying = true;
                        ChangeStep();
                    }
                    else
                    {
                        return;
                    }
                }
                DelayBeforePlacingOnGround = MaxDelay;
            }
            IgnoreCombat = false;
            bool SafeToPlaceAllyDown = true;

            {
                if (guardian.Velocity.Y == 0)
                {
                    int StartCheckX = (int)((guardian.Position.X - guardian.CollisionWidth * 0.5f) * TerraGuardian.DivisionBy16),
                        EndCheckX   = (int)((guardian.Position.X + guardian.CollisionWidth * 0.5f + 1) * TerraGuardian.DivisionBy16);
                    int CheckY      = (int)((guardian.Position.Y + 1) * TerraGuardian.DivisionBy16);
                    for (int x = StartCheckX; x < EndCheckX; x++)
                    {
                        if (MainMod.IsDangerousTile(x, CheckY, false))
                        {
                            SafeToPlaceAllyDown = false;
                            break;
                        }

                        /*Tile tile = MainMod.GetTile(x, CheckY);
                         * if (tile.liquid >= 20)
                         * {
                         *  SafeToPlaceAllyDown = false;
                         *  break;
                         * }*/
                    }
                }
                else
                {
                    SafeToPlaceAllyDown = false;
                }
                if (!TargetIsKod && DelayBeforePlacingOnGround > 2.5f * 60)
                {
                    DelayBeforePlacingOnGround = (int)(2.5f * 60);
                }
                if (SafeToPlaceAllyDown && TargetIsKod)
                {
                    for (int n = 0; n < 200; n++)
                    {
                        if (Main.npc[n].active && guardian.IsNpcHostile(Main.npc[n]) && guardian.Distance(Main.npc[n].Center) < 400 && (Main.npc[n].noTileCollide || Collision.CanHitLine(Main.npc[n].position, Main.npc[n].width, Main.npc[n].height, guardian.TopLeftPosition, guardian.Width, guardian.Height)))
                        {
                            SafeToPlaceAllyDown = false;
                            break;
                        }
                    }
                }
            }
            if (SafeToPlaceAllyDown)
            {
                guardian.MoveLeft = guardian.MoveRight = false;
                if (DelayBeforePlacingOnGround <= 0)
                {
                    if (CarriedPlayer != null)
                    {
                        CarriedPlayer.position.X = guardian.Position.X - CarriedPlayer.width * 0.5f;
                        CarriedPlayer.position.Y = guardian.Position.Y - CarriedPlayer.height;
                        InUse = false;
                        return;
                    }
                    CarriedGuardian.Position.X = guardian.Position.X;
                    CarriedGuardian.Position.Y = guardian.Position.Y;
                    InUse = false;
                    return;
                }
                DelayBeforePlacingOnGround--;
            }
            else
            {
                if (TargetIsKod)
                {
                    DelayBeforePlacingOnGround = MaxDelay;
                }
                bool AllyIsDying = CarriedPlayer != null ? CarriedPlayer.statLife < CarriedPlayer.statLifeMax2 * 0.35f : CarriedGuardian.HP < CarriedGuardian.MHP * 0.35f;
                ForcedTactic = AllyIsDying ? CombatTactic.Snipe : CombatTactic.Assist;
            }
            {
                Vector2 CarryPosition = Vector2.Zero;
                Vector2 Origin        = Vector2.One * 0.5f;
                if (guardian.Ducking)
                {
                    CarryPosition = guardian.GetBetweenHandsPosition(guardian.Base.DuckingSwingFrames[2]);
                }
                else
                {
                    CarryPosition = guardian.GetBetweenHandsPosition(guardian.Base.ItemUseFrames[2]);
                }
                CarryPosition += guardian.Position;
                if (CarriedPlayer != null)
                {
                    CarriedPlayer.position.X    = CarryPosition.X - CarriedPlayer.width * Origin.X + guardian.OffsetX;
                    CarriedPlayer.position.Y    = CarryPosition.Y - CarriedPlayer.height * Origin.Y + guardian.OffsetY;
                    CarriedPlayer.fallStart     = (int)(CarriedPlayer.position.Y * TerraGuardian.DivisionBy16);
                    CarriedPlayer.direction     = guardian.Direction;
                    CarriedPlayer.immune        = true;
                    CarriedPlayer.immuneTime    = 3;
                    CarriedPlayer.immuneNoBlink = true;
                    PlayerMod pm = CarriedPlayer.GetModPlayer <PlayerMod>();
                    pm.ReviveBoost++;
                    pm.BeingCarriedByGuardian = true;
                    MainMod.DrawMoment.Add(new GuardianDrawMoment(guardian.WhoAmID, TerraGuardian.TargetTypes.Player, CarriedPlayer.whoAmI));
                }
                else
                {
                    CarriedGuardian.IsBeingPulledByPlayer = false;
                    CarriedGuardian.Position.X            = CarryPosition.X - (CarriedGuardian.Width * (Origin.X - 0.5f)) + guardian.OffsetX;
                    CarriedGuardian.Position.Y            = CarryPosition.Y + (CarriedGuardian.Height * (1.1f - Origin.Y)) + guardian.OffsetY;
                    CarriedGuardian.SetFallStart();
                    CarriedGuardian.Direction = guardian.Direction;
                    CarriedGuardian.ReviveBoost++;
                    CarriedGuardian.BeingCarriedByGuardian = true;
                    CarriedGuardian.ImmuneTime             = 3;
                    CarriedGuardian.ImmuneNoBlink          = true;
                    MainMod.DrawMoment.Add(new GuardianDrawMoment(guardian.WhoAmID, TerraGuardian.TargetTypes.Guardian, CarriedGuardian.WhoAmID, true));
                }
            }
        }
        public GuardianSpecialAttackData.AffectedTargets[] AreaDamage(TerraGuardian Caster, int Damage, float Knockback, Rectangle Hitbox, byte CriticalRate = 0, bool AffectAllies = false, bool BlockConsecutiveHits = true)
        {
            List <GuardianSpecialAttackData.AffectedTargets> Targets = new List <GuardianSpecialAttackData.AffectedTargets>();
            float StackedDamage   = 0;
            float StackedCritical = 0;
            int   NewDamage       = Damage;

            if (Caster.OwnerPos > -1 && !MainMod.DisableDamageReductionByNumberOfCompanions)
            {
                float DamageMult = Main.player[Caster.OwnerPos].GetModPlayer <PlayerMod>().DamageMod;
                NewDamage = (int)(NewDamage * DamageMult);
            }
            for (int i = 0; i < 255; i++)
            {
                if (Main.player[i].active && !Main.player[i].dead)
                {
                    Player player = Main.player[i];
                    if ((!BlockConsecutiveHits || !Caster.PlayerHasBeenHit(i)) && (AffectAllies || Caster.IsPlayerHostile(player)) && player.getRect().Intersects(Hitbox))
                    {
                        int HitDirection = Caster.Direction;
                        if ((HitDirection == 1 && player.Center.X < Caster.Position.X) ||
                            (HitDirection == -1 && player.Center.X > Caster.Position.X))
                        {
                            HitDirection *= -1;
                        }
                        bool   Critical = Main.rand.Next(100) < CriticalRate;
                        double result   = player.Hurt(Terraria.DataStructures.PlayerDeathReason.ByCustomReason(" didn't survived " + Caster.Name + "'s attack."), NewDamage, HitDirection, false, false, Critical);
                        if (result > 0)
                        {
                            GuardianSpecialAttackData.AffectedTargets affected = new GuardianSpecialAttackData.AffectedTargets(player);
                            affected.SetDamage((int)result);
                            Targets.Add(affected);
                            if (BlockConsecutiveHits)
                            {
                                Caster.AddPlayerHit(player.whoAmI);
                            }
                            Caster.IncreaseDamageStacker((int)result, player.statLifeMax2);
                            StackedDamage += (float)result;
                            if (Critical)
                            {
                                StackedCritical += (float)result;
                            }
                        }
                    }
                }
                if (i < 200 && Main.npc[i].active)
                {
                    NPC npc = Main.npc[i];
                    if ((!BlockConsecutiveHits || !Caster.NpcHasBeenHit(i)) && Caster.IsNpcHostile(npc) && npc.getRect().Intersects(Hitbox))
                    {
                        int HitDirection = Caster.Direction;
                        if ((HitDirection == 1 && npc.Center.X < Caster.Position.X) ||
                            (HitDirection == -1 && npc.Center.X > Caster.Position.X))
                        {
                            HitDirection *= -1;
                        }
                        bool   Critical = Main.rand.Next(100) < CriticalRate;
                        double result   = npc.StrikeNPC(NewDamage, Knockback, HitDirection, Critical);
                        if (result > 0)
                        {
                            GuardianSpecialAttackData.AffectedTargets affected = new GuardianSpecialAttackData.AffectedTargets(npc);
                            affected.SetDamage((int)result);
                            Targets.Add(affected);
                            if (BlockConsecutiveHits)
                            {
                                Caster.AddNpcHit(npc.whoAmI);
                            }
                            Caster.IncreaseDamageStacker((int)result, npc.lifeMax);
                            StackedDamage += (float)result;
                            if (Critical)
                            {
                                StackedCritical += (float)result;
                            }
                        }
                    }
                }
            }
            foreach (int i in MainMod.ActiveGuardians.Keys)
            {
                if (i != Caster.WhoAmID && (AffectAllies || Caster.IsGuardianHostile(MainMod.ActiveGuardians[i])))
                {
                    TerraGuardian tg = MainMod.ActiveGuardians[i];
                    if (tg.HitBox.Intersects(Hitbox))
                    {
                        int HitDirection = Caster.Direction;
                        if ((HitDirection == 1 && tg.Position.X < Caster.Position.X) ||
                            (HitDirection == -1 && tg.Position.X > Caster.Position.X))
                        {
                            HitDirection *= -1;
                        }
                        bool   Critical = Main.rand.Next(100) < CriticalRate;
                        double result   = tg.Hurt(NewDamage, HitDirection, Critical, DeathMessage: " didn't survived " + Caster.Name + "'s attack.");
                        if (result > 0)
                        {
                            GuardianSpecialAttackData.AffectedTargets affected = new GuardianSpecialAttackData.AffectedTargets(tg);
                            affected.SetDamage((int)result);
                            Targets.Add(affected);
                            Caster.IncreaseDamageStacker((int)result, tg.MHP);
                            StackedDamage += (float)result;
                            if (Critical)
                            {
                                StackedCritical += (float)result;
                            }
                        }
                    }
                }
            }
            if (StackedDamage > 0)
            {
                GuardianSkills.SkillTypes AttackSkill = GuardianSkills.SkillTypes.Strength;
                switch (AttackType)
                {
                case SubAttackCombatType.Ranged:
                    AttackSkill = GuardianSkills.SkillTypes.Ballistic;
                    break;

                case SubAttackCombatType.Magic:
                    AttackSkill = GuardianSkills.SkillTypes.Mysticism;
                    break;
                }
                Caster.AddSkillProgress(StackedDamage, AttackSkill);
                if (StackedCritical > 0)
                {
                    Caster.AddSkillProgress(StackedDamage, GuardianSkills.SkillTypes.Luck);
                }
            }
            return(Targets.ToArray());
        }