diff --git a/Content/Items/Weapons/DuneWyrm/StaffofShiftingSands.cs b/Content/Items/Weapons/DuneWyrm/StaffofShiftingSands.cs index 752c6f6..b95401f 100644 --- a/Content/Items/Weapons/DuneWyrm/StaffofShiftingSands.cs +++ b/Content/Items/Weapons/DuneWyrm/StaffofShiftingSands.cs @@ -1,7 +1,6 @@ -using Decimation.Content.NPCs.DuneWyrm.AncientTombCrawler; +using Decimation.Content.Projectiles.DuneWyrm; using Decimation.Lib.Items; using Decimation.Lib.Util; -using Terraria; using Terraria.ModLoader; namespace Decimation.Content.Items.Weapons.DuneWyrm @@ -11,6 +10,7 @@ namespace Decimation.Content.Items.Weapons.DuneWyrm protected override string ItemName => "Staff of Shifting Sands"; protected override int Damages => 30; protected override DamageType DamagesType => DamageType.Summon; + protected override int ProjectileId => ModContent.ProjectileType(); protected override void InitWeapon() { @@ -18,12 +18,5 @@ namespace Decimation.Content.Items.Weapons.DuneWyrm item.height = 42; item.rare = Rarity.LightRed.GetRarityValue(); } - - public override bool UseItem(Player player) - { - NPC.SpawnOnPlayer(player.whoAmI, ModContent.NPCType()); - - return true; - } } } \ No newline at end of file diff --git a/Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerFriendly.cs b/Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerFriendly.cs index 3e80df1..0abd4b3 100644 --- a/Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerFriendly.cs +++ b/Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerFriendly.cs @@ -11,6 +11,8 @@ namespace Decimation.Content.NPCs.DuneWyrm.AncientTombCrawler public class AncientTombCrawlerFriendlyHead : AncientTombCrawlerFriendly { + public override string Texture => "Decimation/Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerHead"; + public override void SetDefaults() { npc.damage = 50; @@ -39,6 +41,8 @@ namespace Decimation.Content.NPCs.DuneWyrm.AncientTombCrawler public class AncientTombCrawlerFriendlyBody : AncientTombCrawlerFriendly { + public override string Texture => "Decimation/Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerBody"; + public override void SetDefaults() { npc.width = 24; @@ -59,6 +63,8 @@ namespace Decimation.Content.NPCs.DuneWyrm.AncientTombCrawler public class AncientTombCrawlerFriendlyTail : AncientTombCrawlerFriendly { + public override string Texture => "Decimation/Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerTail"; + public override void SetDefaults() { npc.width = 20; @@ -89,7 +95,7 @@ namespace Decimation.Content.NPCs.DuneWyrm.AncientTombCrawler public override void SetStaticDefaults() { - DisplayName.SetDefault("Ancient Tomb Crawler"); + DisplayName.SetDefault("Friendly Ancient Tomb Crawler"); } public override void Init() @@ -113,6 +119,11 @@ namespace Decimation.Content.NPCs.DuneWyrm.AncientTombCrawler undergroundSound = mod.GetLegacySoundSlot(SoundType.Custom, "Sounds/Custom/Earthquake"); } + public override bool PreAI() + { + return false; + } + protected override void SendSoundPacket() { // GetPacket(AncientTombCrawlerMessageType.UndergroundSound).Send(); diff --git a/Content/Projectiles/DuneWyrm/AncientTombCrawler.cs b/Content/Projectiles/DuneWyrm/AncientTombCrawler.cs new file mode 100644 index 0000000..f74f8fb --- /dev/null +++ b/Content/Projectiles/DuneWyrm/AncientTombCrawler.cs @@ -0,0 +1,96 @@ +using Decimation.Lib.Projectile; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Terraria.ModLoader; + +namespace Decimation.Content.Projectiles.DuneWyrm +{ + class AncientTombCrawlerHead : AncientTombCrawler + { + public override string Texture => "Decimation/Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerHead"; + + protected override void Init() + { + base.Init(); + + projectile.damage = 50; + projectile.width = 38; + projectile.height = 38; + projectile.minionSlots = 1f; + } + + public override void InitWorm() + { + base.InitWorm(); + Head = true; + } + } + + class AncientTombCrawlerBody : AncientTombCrawler + { + public override string Texture => "Decimation/Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerBody"; + + protected override void Init() + { + base.Init(); + + projectile.width = 24; + projectile.height = 24; + projectile.damage = 35; + } + } + + class AncientTombCrawlerTail : AncientTombCrawler + { + public override string Texture => "Decimation/Content/NPCs/DuneWyrm/AncientTombCrawler/AncientTombCrawlerTail"; + + protected override void Init() + { + base.Init(); + + projectile.width = 20; + projectile.height = 20; + projectile.damage = 25; + } + + public override void InitWorm() + { + base.InitWorm(); + Tail = true; + } + } + + public abstract class AncientTombCrawler : WormProjectile + { + protected override void Init() + { + projectile.aiStyle = -1; + projectile.penetrate = -1; + projectile.light = 1f; + projectile.tileCollide = false; + projectile.ignoreWater = true; + projectile.netImportant = true; + projectile.timeLeft = int.MaxValue; + projectile.hostile = false; + projectile.friendly = true; + } + + public override void InitWorm() + { + MinLength = 8; + MaxLength = 8; + TailType = ModContent.ProjectileType(); + BodyType = ModContent.ProjectileType(); + HeadType = ModContent.ProjectileType(); + Speed = 8f; + TurnSpeed = 0.1f; + } + + public override bool PreDraw(SpriteBatch spriteBatch, Color lightColor) + { + Draw(Texture.Replace("Decimation/", ""), spriteBatch, lightColor); + + return false; + } + } +} \ No newline at end of file diff --git a/Lib/Items/DecimationAmmo.cs b/Lib/Items/DecimationAmmo.cs index 6a146a1..3d24cc0 100644 --- a/Lib/Items/DecimationAmmo.cs +++ b/Lib/Items/DecimationAmmo.cs @@ -20,7 +20,7 @@ namespace Decimation.Lib.Items this.item.damage = Damages; - this.item.shoot = ItemUtils.GetIdFromName(this.Projectile, typeof(Projectile), this.VanillaProjectile); + this.item.shoot = ItemUtils.GetIdFromName(this.Projectile, typeof(Terraria.Projectile), this.VanillaProjectile); this.item.ammo = this.Ammo; this.item.ranged = true; diff --git a/Lib/Items/DecimationWeapon.cs b/Lib/Items/DecimationWeapon.cs index 4a5c356..742e278 100644 --- a/Lib/Items/DecimationWeapon.cs +++ b/Lib/Items/DecimationWeapon.cs @@ -58,7 +58,7 @@ namespace Decimation.Lib.Items if (ProjectileName != null) item.shoot = - ItemUtils.GetIdFromName(ProjectileName, typeof(Projectile), VanillaProjectile); + ItemUtils.GetIdFromName(ProjectileName, typeof(Terraria.Projectile), VanillaProjectile); if (ProjectileId > -1) item.shoot = ProjectileId; if (AmmoName != null) diff --git a/Lib/Projectile/WormProjectile.cs b/Lib/Projectile/WormProjectile.cs index 718ae54..c39d008 100644 --- a/Lib/Projectile/WormProjectile.cs +++ b/Lib/Projectile/WormProjectile.cs @@ -1,485 +1,504 @@ using System; using Decimation.Content.Projectiles; -using Decimation.Lib.Util; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Terraria; -using Terraria.ID; -namespace Decimation.Lib.projectiles +namespace Decimation.Lib.Projectile { public abstract class WormProjectile : DecimationProjectile { - // protected int BodyType; - // protected bool Directional = false; - // - // protected bool Flies = false; - // - // /* ai[0] = follower - // * ai[1] = following - // * ai[2] = distanceFromTail - // * ai[3] = head - // */ - // protected bool Head; - // protected int HeadType; - // protected int MaxLength; - // protected int MinLength; - // protected float Speed; - // protected bool Tail; - // protected int TailType; - // - // protected float TurnSpeed; - // - // protected int Target; - // protected int RealLife; - // - // public override void AI() - // { - // if (projectile.localAI[1] == 0f) - // { - // projectile.localAI[1] = 1f; - // Init(); - // } - // - // if (projectile.ai[3] > 0f) RealLife = (int) projectile.ai[3]; - // if (!Head && projectile.timeLeft < 300) projectile.timeLeft = 300; - // if (Target < 0 || Target == 255 || Main.player[Target].dead) - // TargetClosest(); - // if (Main.player[Target].dead && projectile.timeLeft > 300) projectile.timeLeft = 300; - // if (Main.netMode != 1) - // { - // if (!Tail && projectile.ai[0] == 0f) - // { - // if (Head) - // { - // projectile.ai[3] = projectile.whoAmI; - // RealLife = projectile.whoAmI; - // projectile.ai[2] = Main.rand.Next(MinLength, MaxLength + 1); - // projectile.ai[0] = Projectile.NewProjectile( - // (int) (projectile.position.X + projectile.width / 2f), - // (int) (projectile.position.Y + projectile.height), - // 0f, - // 0f, - // BodyType, - // 0, - // 0f, - // projectile.owner - // ); - // } - // else if (projectile.ai[2] > 0f) - // { - // projectile.ai[0] = Projectile.NewProjectile( - // (int) (projectile.position.X + projectile.width / 2f), - // (int) (projectile.position.Y + projectile.height), - // 0f, - // 0f, - // projectile.type, - // 0, - // 0f, - // projectile.owner - // ); - // } - // else - // { - // projectile.ai[0] = Projectile.NewProjectile( - // (int) (projectile.position.X + projectile.width / 2f), - // (int) (projectile.position.Y + projectile.height), - // 0f, - // 0f, - // TailType, - // 0, - // 0f, - // projectile.whoAmI - // ); - // } - // - // Main.projectile[(int) projectile.ai[0]].ai[3] = projectile.ai[3]; - // ((WormProjectile) Main.projectile[(int) projectile.ai[0]].modProjectile).RealLife = RealLife; - // Main.projectile[(int) projectile.ai[0]].ai[1] = projectile.whoAmI; - // Main.projectile[(int) projectile.ai[0]].ai[2] = projectile.ai[2] - 1f; - // projectile.netUpdate = true; - // } - // - // if (!Head && (!Main.projectile[(int) projectile.ai[1]].active || - // Main.projectile[(int) projectile.ai[1]].type != HeadType && - // Main.projectile[(int) projectile.ai[1]].type != BodyType)) - // { - // // projectile.life = 0; - // // projectile.HitEffect(); - // projectile.active = false; - // } - // - // if (!Tail && (!Main.projectile[(int) projectile.ai[0]].active || - // Main.projectile[(int) projectile.ai[0]].type != BodyType && - // Main.projectile[(int) projectile.ai[0]].type != TailType)) - // { - // // projectile.life = 0; - // // projectile.HitEffect(); - // projectile.active = false; - // } - // - // if (!projectile.active && Main.netMode == 2) - // NetMessage.SendData(28, -1, -1, null, projectile.whoAmI, -1f); - // } - // - // var num180 = (int) (projectile.position.X / 16f) - 1; - // var num181 = (int) ((projectile.position.X + projectile.width) / 16f) + 2; - // var num182 = (int) (projectile.position.Y / 16f) - 1; - // var num183 = (int) ((projectile.position.Y + projectile.height) / 16f) + 2; - // if (num180 < 0) num180 = 0; - // if (num181 > Main.maxTilesX) num181 = Main.maxTilesX; - // if (num182 < 0) num182 = 0; - // if (num183 > Main.maxTilesY) num183 = Main.maxTilesY; - // var flag18 = Flies; - // if (!flag18) - // for (var num184 = num180; num184 < num181; num184++) - // for (var num185 = num182; num185 < num183; num185++) - // if (Main.tile[num184, num185] != null && - // (Main.tile[num184, num185].nactive() && - // (Main.tileSolid[Main.tile[num184, num185].type] || - // Main.tileSolidTop[Main.tile[num184, num185].type] && Main.tile[num184, num185].frameY == 0) || - // Main.tile[num184, num185].liquid > 64)) - // { - // Vector2 vector17; - // vector17.X = num184 * 16; - // vector17.Y = num185 * 16; - // if (projectile.position.X + projectile.width > vector17.X && - // projectile.position.X < vector17.X + 16f && - // projectile.position.Y + projectile.height > vector17.Y && - // projectile.position.Y < vector17.Y + 16f) - // { - // flag18 = true; - // // if (Main.rand.NextBool(100) && projectile.behindTiles && - // // Main.tile[num184, num185].nactive()) - // // WorldGen.KillTile(num184, num185, true, true); - // if (Main.netMode != 1 && Main.tile[num184, num185].type == 2) - // { - // var arg_BFCA_0 = Main.tile[num184, num185 - 1].type; - // } - // } - // } - // - // if (!flag18 && Head) - // { - // var rectangle = new Rectangle((int) projectile.position.X, (int) projectile.position.Y, - // projectile.width, projectile.height); - // var num186 = 1000; - // var flag19 = true; - // for (var num187 = 0; num187 < 255; num187++) - // if (Main.player[num187].active) - // { - // var rectangle2 = new Rectangle((int) Main.player[num187].position.X - num186, - // (int) Main.player[num187].position.Y - num186, num186 * 2, num186 * 2); - // if (rectangle.Intersects(rectangle2)) - // { - // flag19 = false; - // break; - // } - // } - // - // if (flag19) flag18 = true; - // } - // - // if (Directional) - // { - // if (projectile.velocity.X < 0f) - // projectile.spriteDirection = 1; - // else if (projectile.velocity.X > 0f) projectile.spriteDirection = -1; - // } - // - // var num188 = Speed; - // var num189 = TurnSpeed; - // var vector18 = new Vector2(projectile.position.X + projectile.width * 0.5f, - // projectile.position.Y + projectile.height * 0.5f); - // var num191 = Main.player[Target].position.X + Main.player[Target].width / 2; - // var num192 = Main.player[Target].position.Y + Main.player[Target].height / 2; - // num191 = (int) (num191 / 16f) * 16; - // num192 = (int) (num192 / 16f) * 16; - // vector18.X = (int) (vector18.X / 16f) * 16; - // vector18.Y = (int) (vector18.Y / 16f) * 16; - // num191 -= vector18.X; - // num192 -= vector18.Y; - // var num193 = (float) Math.Sqrt(num191 * num191 + num192 * num192); - // if (projectile.ai[1] > 0f && projectile.ai[1] < Main.projectile.Length) - // { - // try - // { - // vector18 = new Vector2(projectile.position.X + projectile.width * 0.5f, - // projectile.position.Y + projectile.height * 0.5f); - // num191 = Main.projectile[(int) projectile.ai[1]].position.X + - // Main.projectile[(int) projectile.ai[1]].width / 2 - - // vector18.X; - // num192 = Main.projectile[(int) projectile.ai[1]].position.Y + - // Main.projectile[(int) projectile.ai[1]].height / 2 - - // vector18.Y; - // } - // catch - // { - // } - // - // projectile.rotation = (float) Math.Atan2(num192, num191) + 1.57f; - // num193 = (float) Math.Sqrt(num191 * num191 + num192 * num192); - // int num194 = projectile.width; - // num193 = (num193 - num194) / num193; - // num191 *= num193; - // num192 *= num193; - // projectile.velocity = Vector2.Zero; - // projectile.position.X = projectile.position.X + num191; - // projectile.position.Y = projectile.position.Y + num192; - // if (Directional) - // { - // if (num191 < 0f) projectile.spriteDirection = 1; - // if (num191 > 0f) projectile.spriteDirection = -1; - // } - // } - // else - // { - // if (!flag18) - // { - // TargetClosest(); - // projectile.velocity.Y = projectile.velocity.Y + 0.11f; - // if (projectile.velocity.Y > num188) projectile.velocity.Y = num188; - // if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188 * 0.4) - // { - // if (projectile.velocity.X < 0f) - // projectile.velocity.X = projectile.velocity.X - num189 * 1.1f; - // else - // projectile.velocity.X = projectile.velocity.X + num189 * 1.1f; - // } - // else if (projectile.velocity.Y == num188) - // { - // if (projectile.velocity.X < num191) - // projectile.velocity.X = projectile.velocity.X + num189; - // else if (projectile.velocity.X > num191) projectile.velocity.X = projectile.velocity.X - num189; - // } - // else if (projectile.velocity.Y > 4f) - // { - // if (projectile.velocity.X < 0f) - // projectile.velocity.X = projectile.velocity.X + num189 * 0.9f; - // else - // projectile.velocity.X = projectile.velocity.X - num189 * 0.9f; - // } - // } - // else - // { - // if (!Flies && projectile.BehindTiles() && projectile.soundDelay == 0) - // if (Main.netMode != NetmodeID.MultiplayerClient) - // { - // projectile.soundDelay = 120; - // - // Main.PlaySound(undergroundSound, projectile.position); - // if (Main.netMode == NetmodeID.Server) SendSoundPacket(); - // } - // - // num193 = (float) Math.Sqrt(num191 * num191 + num192 * num192); - // var num196 = Math.Abs(num191); - // var num197 = Math.Abs(num192); - // var num198 = num188 / num193; - // num191 *= num198; - // num192 *= num198; - // if (ShouldRun()) - // { - // if (Main.netMode != 1 && - // projectile.position.Y / 16f > (Main.rockLayer + Main.maxTilesY) / 2.0) - // { - // projectile.active = false; - // var num200 = (int) projectile.ai[0]; - // while (num200 > 0 && num200 < 200 && Main.projectile[num200].active && - // Main.projectile[num200].aiStyle == projectile.aiStyle) - // { - // var num201 = (int) Main.projectile[num200].ai[0]; - // Main.projectile[num200].active = false; - // projectile.life = 0; - // if (Main.netMode == 2) NetMessage.SendData(23, -1, -1, null, num200); - // num200 = num201; - // } - // - // if (Main.netMode == 2) NetMessage.SendData(23, -1, -1, null, projectile.whoAmI); - // } - // - // num191 = 0f; - // num192 = num188; - // } - // - // var flag21 = false; - // if (projectile.type == 87) - // { - // if ((projectile.velocity.X > 0f && num191 < 0f || projectile.velocity.X < 0f && num191 > 0f || - // projectile.velocity.Y > 0f && num192 < 0f || projectile.velocity.Y < 0f && num192 > 0f) && - // Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) > num189 / 2f && - // num193 < 300f) - // { - // flag21 = true; - // if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188) - // projectile.velocity *= 1.1f; - // } - // - // if (projectile.position.Y > Main.player[Target].position.Y || - // Main.player[Target].position.Y / 16f > Main.worldSurface || - // Main.player[Target].dead) - // { - // flag21 = true; - // if (Math.Abs(projectile.velocity.X) < num188 / 2f) - // { - // if (projectile.velocity.X == 0f) - // projectile.velocity.X = projectile.velocity.X - projectile.direction; - // projectile.velocity.X = projectile.velocity.X * 1.1f; - // } - // else - // { - // if (projectile.velocity.Y > -num188) - // projectile.velocity.Y = projectile.velocity.Y - num189; - // } - // } - // } - // - // if (!flag21) - // { - // if (projectile.velocity.X > 0f && num191 > 0f || projectile.velocity.X < 0f && num191 < 0f || - // projectile.velocity.Y > 0f && num192 > 0f || projectile.velocity.Y < 0f && num192 < 0f) - // { - // if (projectile.velocity.X < num191) - // { - // projectile.velocity.X = projectile.velocity.X + num189; - // } - // else - // { - // if (projectile.velocity.X > num191) - // projectile.velocity.X = projectile.velocity.X - num189; - // } - // - // if (projectile.velocity.Y < num192) - // { - // projectile.velocity.Y = projectile.velocity.Y + num189; - // } - // else - // { - // if (projectile.velocity.Y > num192) - // projectile.velocity.Y = projectile.velocity.Y - num189; - // } - // - // if (Math.Abs(num192) < num188 * 0.2 && - // (projectile.velocity.X > 0f && num191 < 0f || - // projectile.velocity.X < 0f && num191 > 0f)) - // { - // if (projectile.velocity.Y > 0f) - // projectile.velocity.Y = projectile.velocity.Y + num189 * 2f; - // else - // projectile.velocity.Y = projectile.velocity.Y - num189 * 2f; - // } - // - // if (Math.Abs(num191) < num188 * 0.2 && - // (projectile.velocity.Y > 0f && num192 < 0f || - // projectile.velocity.Y < 0f && num192 > 0f)) - // { - // if (projectile.velocity.X > 0f) - // projectile.velocity.X = projectile.velocity.X + num189 * 2f; - // else - // projectile.velocity.X = projectile.velocity.X - num189 * 2f; - // } - // } - // else - // { - // if (num196 > num197) - // { - // if (projectile.velocity.X < num191) - // projectile.velocity.X = projectile.velocity.X + num189 * 1.1f; - // else if (projectile.velocity.X > num191) - // projectile.velocity.X = projectile.velocity.X - num189 * 1.1f; - // if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188 * 0.5) - // { - // if (projectile.velocity.Y > 0f) - // projectile.velocity.Y = projectile.velocity.Y + num189; - // else - // projectile.velocity.Y = projectile.velocity.Y - num189; - // } - // } - // else - // { - // if (projectile.velocity.Y < num192) - // projectile.velocity.Y = projectile.velocity.Y + num189 * 1.1f; - // else if (projectile.velocity.Y > num192) - // projectile.velocity.Y = projectile.velocity.Y - num189 * 1.1f; - // if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188 * 0.5) - // { - // if (projectile.velocity.X > 0f) - // projectile.velocity.X = projectile.velocity.X + num189; - // else - // projectile.velocity.X = projectile.velocity.X - num189; - // } - // } - // } - // } - // } - // - // projectile.rotation = (float) Math.Atan2(projectile.velocity.Y, projectile.velocity.X) + 1.57f; - // if (Head) - // { - // if (flag18) - // { - // if (projectile.localAI[0] != 1f) projectile.netUpdate = true; - // projectile.localAI[0] = 1f; - // } - // else - // { - // if (projectile.localAI[0] != 0f) projectile.netUpdate = true; - // projectile.localAI[0] = 0f; - // } - // - // if ((projectile.velocity.X > 0f && projectile.oldVelocity.X < 0f || - // projectile.velocity.X < 0f && projectile.oldVelocity.X > 0f || - // projectile.velocity.Y > 0f && projectile.oldVelocity.Y < 0f || - // projectile.velocity.Y < 0f && projectile.oldVelocity.Y > 0f) && !projectile.justHit) - // { - // projectile.netUpdate = true; - // return; - // } - // } - // } - // - // CustomBehavior(); - // } - // - // public virtual void Init() - // { - // } - // - // public virtual bool ShouldRun() - // { - // return false; - // } - // - // public virtual void CustomBehavior() - // { - // } - // - // public override bool? DrawHealthBar(byte hbPosition, ref float scale, ref Vector2 position) - // { - // return Head ? (bool?) null : false; - // } - // - // protected void Draw(string texturePath, SpriteBatch spriteBatch, Color drawColor) - // { - // var frameSize = new Vector2(projectile.width, projectile.height); - // var texture = mod.GetTexture(texturePath); - // - // spriteBatch.Draw - // ( - // texture, - // new Vector2( - // projectile.position.X - Main.screenPosition.X + frameSize.X / 2, - // projectile.position.Y - Main.screenPosition.Y + frameSize.Y / 2 - // ), - // projectile.frame, - // drawColor, - // projectile.rotation, - // frameSize * 0.5f, - // projectile.scale, - // SpriteEffects.None, - // 0f - // ); - // } - // - // protected abstract void SendSoundPacket(); + protected int BodyType; + protected bool Directional = false; + + protected bool Flies = false; + + /* ai[0] = follower + * ai[1] = following + * ai[2] = distanceFromTail + * ai[3] = head + */ + protected bool Head; + protected int HeadType; + protected int MaxLength; + protected int MinLength; + protected float Speed; + protected bool Tail; + protected int TailType; + + protected float TurnSpeed; + + protected int Target; + protected int RealLife; + + protected float DistanceFromTail; + protected float WormHead; + + public override void AI() + { + if (projectile.localAI[1] == 0f) + { + projectile.localAI[1] = 1f; + InitWorm(); + } + + if (WormHead > 0f) RealLife = (int) WormHead; + + if (!Head && projectile.timeLeft < 300) projectile.timeLeft = 300; + if (Target < 0 || Target == 255 || !Main.npc[Target].active) + TargetClosest(); + if (Main.player[projectile.owner].dead && projectile.timeLeft > 300) projectile.timeLeft = 300; + + Entity target; + if (Target < 0) + { + target = Main.player[projectile.owner]; + } + else + { + target = Main.npc[Target]; + } + + if (Main.netMode != 1) + { + if (!Tail && projectile.ai[0] == 0f) + { + if (Head) + { + WormHead = projectile.whoAmI; + RealLife = projectile.whoAmI; + DistanceFromTail = Main.rand.Next(MinLength, MaxLength + 1); + projectile.ai[0] = Terraria.Projectile.NewProjectile( + (int) (projectile.position.X + projectile.width / 2f), + (int) (projectile.position.Y + projectile.height), + 0f, + 0f, + BodyType, + 0, + 0f, + projectile.owner + ); + } + else if (DistanceFromTail > 0f) + { + projectile.ai[0] = Terraria.Projectile.NewProjectile( + (int) (projectile.position.X + projectile.width / 2f), + (int) (projectile.position.Y + projectile.height), + 0f, + 0f, + projectile.type, + 0, + 0f, + projectile.owner + ); + } + else + { + projectile.ai[0] = Terraria.Projectile.NewProjectile( + (int) (projectile.position.X + projectile.width / 2f), + (int) (projectile.position.Y + projectile.height), + 0f, + 0f, + TailType, + 0, + 0f, + projectile.whoAmI + ); + } + + ((WormProjectile) Main.projectile[(int) projectile.ai[0]].modProjectile).WormHead = WormHead; + ((WormProjectile) Main.projectile[(int) projectile.ai[0]].modProjectile).RealLife = RealLife; + Main.projectile[(int) projectile.ai[0]].ai[1] = projectile.whoAmI; + ((WormProjectile) Main.projectile[(int) projectile.ai[0]].modProjectile).DistanceFromTail = + DistanceFromTail - 1f; + projectile.netUpdate = true; + } + } + + var num180 = (int) (projectile.position.X / 16f) - 1; + var num181 = (int) ((projectile.position.X + projectile.width) / 16f) + 2; + var num182 = (int) (projectile.position.Y / 16f) - 1; + var num183 = (int) ((projectile.position.Y + projectile.height) / 16f) + 2; + if (num180 < 0) num180 = 0; + if (num181 > Main.maxTilesX) num181 = Main.maxTilesX; + if (num182 < 0) num182 = 0; + if (num183 > Main.maxTilesY) num183 = Main.maxTilesY; + var flag18 = Flies; + if (!flag18) + for (var num184 = num180; num184 < num181; num184++) + for (var num185 = num182; num185 < num183; num185++) + if (Main.tile[num184, num185] != null && + (Main.tile[num184, num185].nactive() && + (Main.tileSolid[Main.tile[num184, num185].type] || + Main.tileSolidTop[Main.tile[num184, num185].type] && Main.tile[num184, num185].frameY == 0) || + Main.tile[num184, num185].liquid > 64)) + { + Vector2 vector17; + vector17.X = num184 * 16; + vector17.Y = num185 * 16; + if (projectile.position.X + projectile.width > vector17.X && + projectile.position.X < vector17.X + 16f && + projectile.position.Y + projectile.height > vector17.Y && + projectile.position.Y < vector17.Y + 16f) + { + flag18 = true; + } + } + + if (!flag18 && Head) + { + var rectangle = new Rectangle((int) projectile.position.X, (int) projectile.position.Y, + projectile.width, projectile.height); + var num186 = 1000; + var flag19 = true; + for (var num187 = 0; num187 < 255; num187++) + if (Main.player[num187].active) + { + var rectangle2 = new Rectangle((int) Main.player[num187].position.X - num186, + (int) Main.player[num187].position.Y - num186, num186 * 2, num186 * 2); + if (rectangle.Intersects(rectangle2)) + { + flag19 = false; + break; + } + } + + if (flag19) flag18 = true; + } + + if (Directional) + { + if (projectile.velocity.X < 0f) + projectile.spriteDirection = 1; + else if (projectile.velocity.X > 0f) projectile.spriteDirection = -1; + } + + var num188 = Speed; + var num189 = TurnSpeed; + var vector18 = new Vector2(projectile.position.X + projectile.width * 0.5f, + projectile.position.Y + projectile.height * 0.5f); + var num191 = target.position.X + target.width / 2f; + var num192 = target.position.Y + target.height / 2f; + + num191 = (int) (num191 / 16f) * 16; + num192 = (int) (num192 / 16f) * 16; + vector18.X = (int) (vector18.X / 16f) * 16; + vector18.Y = (int) (vector18.Y / 16f) * 16; + num191 -= vector18.X; + num192 -= vector18.Y; + var num193 = (float) Math.Sqrt(num191 * num191 + num192 * num192); + if (projectile.ai[1] > 0f && projectile.ai[1] < Main.projectile.Length) + { + try + { + vector18 = new Vector2(projectile.position.X + projectile.width * 0.5f, + projectile.position.Y + projectile.height * 0.5f); + num191 = Main.projectile[(int) projectile.ai[1]].position.X + + Main.projectile[(int) projectile.ai[1]].width / 2 - + vector18.X; + num192 = Main.projectile[(int) projectile.ai[1]].position.Y + + Main.projectile[(int) projectile.ai[1]].height / 2 - + vector18.Y; + } + catch + { + } + + projectile.rotation = (float) Math.Atan2(num192, num191) + 1.57f; + num193 = (float) Math.Sqrt(num191 * num191 + num192 * num192); + int num194 = projectile.width; + num193 = (num193 - num194) / num193; + num191 *= num193; + num192 *= num193; + projectile.velocity = Vector2.Zero; + projectile.position.X = projectile.position.X + num191; + projectile.position.Y = projectile.position.Y + num192; + if (Directional) + { + if (num191 < 0f) projectile.spriteDirection = 1; + if (num191 > 0f) projectile.spriteDirection = -1; + } + } + else + { + if (!flag18) + { + TargetClosest(); + projectile.velocity.Y = projectile.velocity.Y + 0.11f; + if (projectile.velocity.Y > num188) projectile.velocity.Y = num188; + if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188 * 0.4) + { + if (projectile.velocity.X < 0f) + projectile.velocity.X = projectile.velocity.X - num189 * 1.1f; + else + projectile.velocity.X = projectile.velocity.X + num189 * 1.1f; + } + else if (projectile.velocity.Y == num188) + { + if (projectile.velocity.X < num191) + projectile.velocity.X = projectile.velocity.X + num189; + else if (projectile.velocity.X > num191) projectile.velocity.X = projectile.velocity.X - num189; + } + else if (projectile.velocity.Y > 4f) + { + if (projectile.velocity.X < 0f) + projectile.velocity.X = projectile.velocity.X + num189 * 0.9f; + else + projectile.velocity.X = projectile.velocity.X - num189 * 0.9f; + } + } + else + { + // if (!Flies && projectile.BehindTiles() && projectile.soundDelay == 0) + // if (Main.netMode != NetmodeID.MultiplayerClient) + // { + // projectile.soundDelay = 120; + + // Main.PlaySound(undergroundSound, projectile.position); + // if (Main.netMode == NetmodeID.Server) SendSoundPacket(); + // } + + num193 = (float) Math.Sqrt(num191 * num191 + num192 * num192); + var num196 = Math.Abs(num191); + var num197 = Math.Abs(num192); + var num198 = num188 / num193; + num191 *= num198; + num192 *= num198; + if (ShouldRun()) + { + if (Main.netMode != 1 && + projectile.position.Y / 16f > (Main.rockLayer + Main.maxTilesY) / 2.0) + { + projectile.active = false; + var num200 = (int) projectile.ai[0]; + while (num200 > 0 && num200 < 200 && Main.projectile[num200].active && + Main.projectile[num200].aiStyle == projectile.aiStyle) + { + var num201 = (int) Main.projectile[num200].ai[0]; + Main.projectile[num200].active = false; + // projectile.life = 0; + if (Main.netMode == 2) NetMessage.SendData(23, -1, -1, null, num200); + num200 = num201; + } + + if (Main.netMode == 2) NetMessage.SendData(23, -1, -1, null, projectile.whoAmI); + } + + num191 = 0f; + num192 = num188; + } + + var flag21 = false; + if (projectile.type == 87) + { + if ((projectile.velocity.X > 0f && num191 < 0f || projectile.velocity.X < 0f && num191 > 0f || + projectile.velocity.Y > 0f && num192 < 0f || projectile.velocity.Y < 0f && num192 > 0f) && + Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) > num189 / 2f && + num193 < 300f) + { + flag21 = true; + if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188) + projectile.velocity *= 1.1f; + } + + if (projectile.position.Y > Main.npc[Target].position.Y || + Main.npc[Target].position.Y / 16f > Main.worldSurface || + !Main.npc[Target].active) + { + flag21 = true; + if (Math.Abs(projectile.velocity.X) < num188 / 2f) + { + if (projectile.velocity.X == 0f) + projectile.velocity.X = projectile.velocity.X - projectile.direction; + projectile.velocity.X = projectile.velocity.X * 1.1f; + } + else + { + if (projectile.velocity.Y > -num188) + projectile.velocity.Y = projectile.velocity.Y - num189; + } + } + } + + if (!flag21) + { + if (projectile.velocity.X > 0f && num191 > 0f || projectile.velocity.X < 0f && num191 < 0f || + projectile.velocity.Y > 0f && num192 > 0f || projectile.velocity.Y < 0f && num192 < 0f) + { + if (projectile.velocity.X < num191) + { + projectile.velocity.X = projectile.velocity.X + num189; + } + else + { + if (projectile.velocity.X > num191) + projectile.velocity.X = projectile.velocity.X - num189; + } + + if (projectile.velocity.Y < num192) + { + projectile.velocity.Y = projectile.velocity.Y + num189; + } + else + { + if (projectile.velocity.Y > num192) + projectile.velocity.Y = projectile.velocity.Y - num189; + } + + if (Math.Abs(num192) < num188 * 0.2 && + (projectile.velocity.X > 0f && num191 < 0f || + projectile.velocity.X < 0f && num191 > 0f)) + { + if (projectile.velocity.Y > 0f) + projectile.velocity.Y = projectile.velocity.Y + num189 * 2f; + else + projectile.velocity.Y = projectile.velocity.Y - num189 * 2f; + } + + if (Math.Abs(num191) < num188 * 0.2 && + (projectile.velocity.Y > 0f && num192 < 0f || + projectile.velocity.Y < 0f && num192 > 0f)) + { + if (projectile.velocity.X > 0f) + projectile.velocity.X = projectile.velocity.X + num189 * 2f; + else + projectile.velocity.X = projectile.velocity.X - num189 * 2f; + } + } + else + { + if (num196 > num197) + { + if (projectile.velocity.X < num191) + projectile.velocity.X = projectile.velocity.X + num189 * 1.1f; + else if (projectile.velocity.X > num191) + projectile.velocity.X = projectile.velocity.X - num189 * 1.1f; + if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188 * 0.5) + { + if (projectile.velocity.Y > 0f) + projectile.velocity.Y = projectile.velocity.Y + num189; + else + projectile.velocity.Y = projectile.velocity.Y - num189; + } + } + else + { + if (projectile.velocity.Y < num192) + projectile.velocity.Y = projectile.velocity.Y + num189 * 1.1f; + else if (projectile.velocity.Y > num192) + projectile.velocity.Y = projectile.velocity.Y - num189 * 1.1f; + if (Math.Abs(projectile.velocity.X) + Math.Abs(projectile.velocity.Y) < num188 * 0.5) + { + if (projectile.velocity.X > 0f) + projectile.velocity.X = projectile.velocity.X + num189; + else + projectile.velocity.X = projectile.velocity.X - num189; + } + } + } + } + } + + projectile.rotation = (float) Math.Atan2(projectile.velocity.Y, projectile.velocity.X) + 1.57f; + if (Head) + { + if (flag18) + { + if (projectile.localAI[0] != 1f) projectile.netUpdate = true; + projectile.localAI[0] = 1f; + } + else + { + if (projectile.localAI[0] != 0f) projectile.netUpdate = true; + projectile.localAI[0] = 0f; + } + + if ((projectile.velocity.X > 0f && projectile.oldVelocity.X < 0f || + projectile.velocity.X < 0f && projectile.oldVelocity.X > 0f || + projectile.velocity.Y > 0f && projectile.oldVelocity.Y < 0f || + projectile.velocity.Y < 0f && projectile.oldVelocity.Y > 0f) /* && !projectile.justHit*/) + { + projectile.netUpdate = true; + return; + } + } + } + + CustomBehavior(); + } + + public virtual void InitWorm() + { + } + + protected virtual void TargetClosest() + { + if (!Head) return; + + Target = -1; + Player player13 = Main.player[projectile.owner]; + + float num1105 = 700f; + float num1106 = 1000f; + + NPC ownerMinionAttackTargetNPC5 = projectile.OwnerMinionAttackTargetNPC; + if (ownerMinionAttackTargetNPC5 != null && ownerMinionAttackTargetNPC5.CanBeChasedBy(this)) + { + float distance = projectile.Distance(ownerMinionAttackTargetNPC5.Center); + if (distance < num1105 * 2f) + { + Target = ownerMinionAttackTargetNPC5.whoAmI; + } + } + + if (Target < 0) + { + for (int num1112 = 0; num1112 < 200; num1112++) + { + NPC nPC15 = Main.npc[num1112]; + if (!nPC15.CanBeChasedBy(this) || !(player13.Distance(nPC15.Center) < num1106)) + { + continue; + } + + float num1113 = projectile.Distance(nPC15.Center); + if (num1113 < num1105) + { + Target = num1112; + } + } + } + } + + public virtual bool ShouldRun() + { + return false; + } + + public virtual void CustomBehavior() + { + } + + protected void Draw(string texturePath, SpriteBatch spriteBatch, Color drawColor) + { + var frameSize = new Vector2(projectile.width, projectile.height); + var texture = mod.GetTexture(texturePath); + + spriteBatch.Draw + ( + texture, + new Vector2( + projectile.position.X - Main.screenPosition.X + frameSize.X / 2, + projectile.position.Y - Main.screenPosition.Y + frameSize.Y / 2 + ), + null, + drawColor, + projectile.rotation, + frameSize * 0.5f, + projectile.scale, + SpriteEffects.None, + 0f + ); + } } } \ No newline at end of file diff --git a/Lib/Util/ItemUtils.cs b/Lib/Util/ItemUtils.cs index 556f5b6..372d918 100644 --- a/Lib/Util/ItemUtils.cs +++ b/Lib/Util/ItemUtils.cs @@ -31,7 +31,7 @@ namespace Decimation.Lib.Util int id = int.MinValue; if (entityType == typeof(Item)) id = Mod.ItemType(name); - else if (entityType == typeof(Projectile)) + else if (entityType == typeof(Terraria.Projectile)) id = Mod.ProjectileType(name); else if (entityType == typeof(NPC)) id = Mod.NPCType(name); @@ -50,7 +50,7 @@ namespace Decimation.Lib.Util Type idType; if (entityType == typeof(Item)) idType = typeof(ItemID); - else if (entityType == typeof(Projectile)) + else if (entityType == typeof(Terraria.Projectile)) idType = typeof(ProjectileID); else if (entityType == typeof(NPCID)) idType = typeof(NPCID); diff --git a/Lib/Util/ProjectileUtils.cs b/Lib/Util/ProjectileUtils.cs deleted file mode 100644 index d0ffca1..0000000 --- a/Lib/Util/ProjectileUtils.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Terraria; - -namespace Decimation.Lib.Util -{ - public static class ProjectileUtils - { - public static bool BehindTiles(this Projectile projectile) - { - return Main.tile[(int) projectile.position.X, (int) projectile.position.Y].type == -1; // TODO ? - } - } -} \ No newline at end of file