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; }
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); }
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()); }