pixelcord
Terrarian
So I have a worm boss that I am working on, and whenever I go offscreen too far the body and tail parts dissapear, and I can't find out why or how to fix this I would really appreciate some help.
Here is the code for the head
Here is the code for the body
And the code for the tail
Any help is appreciated.
Here is the code for the head
C#:
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
namespace TerrariaExpandedMod.NPCs.FrostbittenMonarch
{
[AutoloadBossHead]
public class FrostbittenMonarchHead : ModNPC
{
public override void SetStaticDefaults()
{
DisplayName.SetDefault("Frostbitten Monarch");
}
public override void SetDefaults()
{
npc.lifeMax = 72000;
npc.damage = 314;
npc.defense = 34;
npc.knockBackResist = 0f;
npc.width = 168;
npc.height = 150;
npc.boss = true;
npc.lavaImmune = true;
npc.noGravity = true;
npc.noTileCollide = true;
npc.HitSound = SoundID.NPCHit5;
npc.DeathSound = SoundID.NPCDeath10;
npc.behindTiles = true;
Main.npcFrameCount[npc.type] = 1;
npc.value = Item.buyPrice(0, 48, 0, 0);
npc.npcSlots = 1f;
npc.netAlways = true;
music = MusicID.Boss5;
}
public override void ScaleExpertStats(int numPlayers, float bossLifeScale)
{
npc.lifeMax = (int)(npc.lifeMax * 0.579f * bossLifeScale);
npc.damage = (int)(npc.damage * 0.6f);
}
public override bool PreAI()
{
if (Main.netMode != 1)
{
if (npc.ai[0] == 0)
{
npc.realLife = npc.whoAmI;
int LatestNPC = npc.whoAmI;
int WormLength = 9;
for (int i = 0; i < WormLength; ++i)
{
LatestNPC = NPC.NewNPC((int)npc.Center.X, (int)npc.Center.Y, mod.NPCType("FrostbittenMonarchBody"), npc.whoAmI, 0, LatestNPC);
Main.npc[(int)LatestNPC].realLife = npc.whoAmI;
Main.npc[(int)LatestNPC].ai[3] = npc.whoAmI;
}
LatestNPC = NPC.NewNPC((int)npc.Center.X, (int)npc.Center.Y, mod.NPCType("FrostbittenMonarchTail"), npc.whoAmI, 0, LatestNPC);
Main.npc[(int)LatestNPC].realLife = npc.whoAmI;
Main.npc[(int)LatestNPC].ai[3] = npc.whoAmI;
npc.ai[0] = 1;
npc.netUpdate = true;
}
}
int minTilePosX = (int)(npc.position.X / 16.0) - 1;
int maxTilePosX = (int)((npc.position.X + npc.width) / 16.0) + 2;
int minTilePosY = (int)(npc.position.Y / 16.0) - 1;
int maxTilePosY = (int)((npc.position.Y + npc.height) / 16.0) + 2;
if (minTilePosX < 0)
minTilePosX = 0;
if (maxTilePosX > Main.maxTilesX)
maxTilePosX = Main.maxTilesX;
if (minTilePosY < 0)
minTilePosY = 0;
if (maxTilePosY > Main.maxTilesY)
maxTilePosY = Main.maxTilesY;
bool collision = false;
for (int i = minTilePosX; i < maxTilePosX; ++i)
{
for (int j = minTilePosY; j < maxTilePosY; ++j)
{
if (Main.tile[i, j] != null && (Main.tile[i, j].nactive() && (Main.tileSolid[(int)Main.tile[i, j].type] || Main.tileSolidTop[(int)Main.tile[i, j].type] && (int)Main.tile[i,j].frameY == 0 || (int)Main.tile[i, j].liquid > 64)))
{
Vector2 vector2;
vector2.X = (float)(i * 16);
vector2.Y = (float)(j * 16);
if (npc.position.X + npc.width > vector2.X && npc.position.X < vector2.X + 16.0 && (npc.position.Y + npc.height > (double)vector2.Y && npc.position.Y < vector2.Y + 16.0))
{
collision = true;
if (Main.rand.Next(100) == 0 && Main.tile[i, j].nactive())
WorldGen.KillTile(i, j, true, true, false);
}
}
}
}
if (!collision)
{
Rectangle rectangle1 = new Rectangle((int)npc.position.X, (int)npc.position.Y, npc.width, npc.height);
int maxDistance = 1000;
bool playerCollision = true;
for (int index = 0; index < 255; ++index)
{
if (Main.player[index].active)
{
Rectangle rectangle2 = new Rectangle((int)Main.player[index].position.X - maxDistance, (int)Main.player[index].position.Y - maxDistance, maxDistance * 2, maxDistance * 2);
if (rectangle1.Intersects(rectangle2))
{
playerCollision = false;
break;
}
}
}
if (playerCollision)
collision = true;
}
float speed = 15f;
float acceleration = 0.08f;
Vector2 npcCenter = new Vector2(npc.position.X + npc.width * 0.5f, npc.position.Y + npc.height * 0.5f);
float targetXPos = Main.player[npc.target].position.X + (Main.player[npc.target].width / 2);
float targetYPos = Main.player[npc.target].position.Y + (Main.player[npc.target].height / 2);
float targetRoundedPosX = (float)((int)(targetXPos / 16.0) * 16);
float targetRoundedPosY = (float)((int)(targetYPos / 16.0) * 16);
npcCenter.X = (float)((int)(npcCenter.X / 16.0) * 16);
npcCenter.Y = (float)((int)(npcCenter.Y / 16.0) * 16);
float dirX = targetRoundedPosX - npcCenter.X;
float dirY = targetRoundedPosY - npcCenter.Y;
float length = (float)Math.Sqrt(dirX * dirX + dirY * dirY);
if (!collision)
{
npc.TargetClosest(true);
npc.velocity.Y = npc.velocity.Y + 0.11f;
if (npc.velocity.Y > speed)
npc.velocity.Y = speed;
if (Math.Abs(npc.velocity.X) + Math.Abs(npc.velocity.Y) < speed * 0.4)
{
if (npc.velocity.X < 0.0)
npc.velocity.X = npc.velocity.X - acceleration * 1.1f;
else
npc.velocity.X = npc.velocity.X + acceleration * 1.1f;
}
else if (npc.velocity.Y == speed)
{
if (npc.velocity.X < dirX)
npc.velocity.X = npc.velocity.X + acceleration;
else if (npc.velocity.X > dirX)
npc.velocity.X = npc.velocity.X - acceleration;
}
else if (npc.velocity.Y > 4.0)
{
if (npc.velocity.X < 0.0)
npc.velocity.X = npc.velocity.X + acceleration * 0.9f;
else
npc.velocity.X = npc.velocity.X - acceleration * 0.9f;
}
}
else
{
if (npc.soundDelay == 0)
{
float num1 = length / 40f;
if (num1 < 10.0)
num1 = 10f;
if (num1 > 20.0)
num1 = 20f;
npc.soundDelay = (int)num1;
Main.PlaySound(15, (int)npc.position.X, (int)npc.position.Y, 1);
}
float absDirX = Math.Abs(dirX);
float absDirY = Math.Abs(dirY);
float newSpeed = speed / length;
dirX = dirX * newSpeed;
dirY = dirY * newSpeed;
if (npc.velocity.X > 0.0 && dirX > 0.0 || npc.velocity.X < 0.0 && dirX < 0.0 || (npc.velocity.Y > 0.0 && dirY > 0.0 || npc.velocity.Y < 0.0 && dirY < 0.0))
{
if (npc.velocity.X < dirX)
npc.velocity.X = npc.velocity.X + acceleration;
else if (npc.velocity.X > dirX)
npc.velocity.X = npc.velocity.X - acceleration;
if (npc.velocity.Y < dirY)
npc.velocity.Y = npc.velocity.Y + acceleration;
else if (npc.velocity.Y > dirY)
npc.velocity.Y = npc.velocity.Y - acceleration;
if (Math.Abs(dirY) < speed * 0.2 && (npc.velocity.X > 0.0 && dirX < 0.0 || npc.velocity.X < 0.0 && dirX > 0.0))
{
if (npc.velocity.Y > 0.0)
npc.velocity.Y = npc.velocity.Y + acceleration * 2f;
else
npc.velocity.Y = npc.velocity.Y - acceleration * 2f;
}
if (Math.Abs(dirX) < speed * 0.2 && (npc.velocity.Y > 0.0 && dirY < 0.0 || npc.velocity.Y < 0.0 && dirY > 0.0))
{
if (npc.velocity.X > 0.0)
npc.velocity.X = npc.velocity.X + acceleration * 2f;
else
npc.velocity.X = npc.velocity.X - acceleration * 2f;
}
}
else if (absDirX > absDirY)
{
if (npc.velocity.X < dirX)
npc.velocity.X = npc.velocity.X + acceleration * 1.1f;
else if (npc.velocity.X > dirX)
npc.velocity.X = npc.velocity.X - acceleration * 1.1f;
if (Math.Abs(npc.velocity.X) + Math.Abs(npc.velocity.Y) < speed * 0.5)
{
if (npc.velocity.Y > 0.0)
npc.velocity.Y = npc.velocity.Y + acceleration;
else
npc.velocity.Y = npc.velocity.Y - acceleration;
}
}
else
{
if (npc.velocity.Y < dirY)
npc.velocity.Y = npc.velocity.Y + acceleration * 1.1f;
else if (npc.velocity.Y > dirY)
npc.velocity.Y = npc.velocity.Y - acceleration * 1.1f;
if (Math.Abs(npc.velocity.X) + Math.Abs(npc.velocity.Y) < speed * 0.5)
{
if (npc.velocity.X > 0.0)
npc.velocity.X = npc.velocity.X + acceleration;
else
npc.velocity.X = npc.velocity.X - acceleration;
}
}
}
npc.rotation = (float)Math.Atan2(npc.velocity.Y, npc.velocity.X) + 1.57f;
if (collision)
{
if (npc.localAI[0] != 1)
npc.netUpdate = true;
npc.localAI[0] = 1f;
}
else
{
if (npc.localAI[0] != 0.0)
npc.netUpdate = true;
npc.localAI[0] = 0.0f;
}
if ((npc.velocity.X > 0.0 && npc.oldVelocity.X < 0.0 || npc.velocity.X < 0.0 && npc.oldVelocity.X > 0.0 || (npc.velocity.Y > 0.0 && npc.oldVelocity.Y < 0.0 || npc.velocity.Y < 0.0 && npc.oldVelocity.Y > 0.0)) && !npc.justHit)
npc.netUpdate = true;
return false;
}
public override bool PreDraw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, Color drawColor)
{
Texture2D texture = Main.npcTexture[npc.type];
Vector2 origin = new Vector2(texture.Width * 0.5f, texture.Height * 0.5f);
Main.spriteBatch.Draw(texture, npc.Center - Main.screenPosition, new Rectangle?(), drawColor, npc.rotation, origin, npc.scale, SpriteEffects.None, 0);
return false;
}
public override bool? DrawHealthBar(byte hbPosition, ref float scale, ref Vector2 position)
{
scale = 1.9f;
return null;
}
}
}
C#:
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
namespace TerrariaExpandedMod.NPCs.FrostbittenMonarch
{
public class FrostbittenMonarchBody : ModNPC
{
public override void SetStaticDefaults()
{
DisplayName.SetDefault("Frostbitten Monarch");
}
public override void SetDefaults()
{
npc.width = 168;
npc.height = 150;
npc.damage = 173;
npc.defense = 32;
npc.lifeMax = 1;
npc.knockBackResist = 0f;
npc.behindTiles = true;
npc.noTileCollide = true;
npc.netAlways = true;
npc.noGravity = true;
npc.dontCountMe = true;
npc.HitSound = SoundID.NPCHit5;
}
public override void ScaleExpertStats(int numPlayers, float bossLifeScale)
{
npc.lifeMax = (int)(npc.lifeMax * 0.579f * bossLifeScale);
npc.damage = (int)(npc.damage * 0.6f);
}
public override bool PreAI()
{
if (npc.ai[3] > 0)
npc.realLife = (int)npc.ai[3];
if (npc.target < 0 || npc.target == byte.MaxValue || Main.player[npc.target].dead)
npc.TargetClosest(true);
if (Main.player[npc.target].dead && npc.timeLeft > 300)
npc.timeLeft = 300;
if (Main.netMode != 1)
{
if (!Main.npc[(int)npc.ai[1]].active)
{
npc.life = 0;
npc.HitEffect(0, 10.0);
npc.active = false;
NetMessage.SendData(28, -1, -1, null, npc.whoAmI, -1f, 0.0f, 0.0f, 0, 0, 0);
}
}
if (npc.ai[1] < (double)Main.npc.Length)
{
Vector2 npcCenter = new Vector2(npc.position.X + (float)npc.width * 0.5f, npc.position.Y + (float)npc.height * 0.5f);
float dirX = Main.npc[(int)npc.ai[1]].position.X + (float)(Main.npc[(int)npc.ai[1]].width / 2) - npcCenter.X;
float dirY = Main.npc[(int)npc.ai[1]].position.Y + (float)(Main.npc[(int)npc.ai[1]].height / 2) - npcCenter.Y;
npc.rotation = (float)Math.Atan2(dirY, dirX) + 1.57f;
float length = (float)Math.Sqrt(dirX * dirX + dirY * dirY);
float dist = (length - (float)npc.width) / length;
float posX = dirX * dist;
float posY = dirY * dist;
npc.velocity = Vector2.Zero;
npc.position.X = npc.position.X + posX;
npc.position.Y = npc.position.Y + posY;
}
return false;
}
public override bool PreDraw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, Color drawColor)
{
Texture2D texture = Main.npcTexture[npc.type];
Vector2 origin = new Vector2(texture.Width * 0.5f, texture.Height * 0.5f);
Main.spriteBatch.Draw(texture, npc.Center - Main.screenPosition, new Rectangle?(), drawColor, npc.rotation, origin, npc.scale, SpriteEffects.None, 0);
return false;
}
public override bool? DrawHealthBar(byte hbPosition, ref float scale, ref Vector2 position)
{
return false;
}
}
}
C#:
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
namespace TerrariaExpandedMod.NPCs.FrostbittenMonarch
{
public class FrostbittenMonarchTail : ModNPC
{
public override void SetStaticDefaults()
{
DisplayName.SetDefault("Frostbitten Monarch");
}
public override void SetDefaults()
{
npc.width = 168;
npc.height = 150;
npc.damage = 125;
npc.defense = 30;
npc.lifeMax = 1;
npc.knockBackResist = 0f;
npc.behindTiles = true;
npc.noTileCollide = true;
npc.netAlways = true;
npc.noGravity = true;
npc.dontCountMe = true;
npc.HitSound = SoundID.NPCHit5;
}
public override void ScaleExpertStats(int numPlayers, float bossLifeScale)
{
npc.lifeMax = (int)(npc.lifeMax * 0.579f * bossLifeScale);
npc.damage = (int)(npc.damage * 0.6f);
}
public override bool PreAI()
{
if (npc.ai[3] > 0)
npc.realLife = (int)npc.ai[3];
if (npc.target < 0 || npc.target == byte.MaxValue || Main.player[npc.target].dead)
npc.TargetClosest(true);
if (Main.player[npc.target].dead && npc.timeLeft > 300)
npc.timeLeft = 300;
if (Main.netMode != 1)
{
if (!Main.npc[(int)npc.ai[1]].active)
{
npc.life = 0;
npc.HitEffect(0, 10.0);
npc.active = false;
NetMessage.SendData(28, -1, -1, null, npc.whoAmI, -1f, 0.0f, 0.0f, 0, 0, 0);
}
}
if (npc.ai[1] < (double)Main.npc.Length)
{
Vector2 npcCenter = new Vector2(npc.position.X + (float)npc.width * 0.5f, npc.position.Y + (float)npc.height * 0.5f);
float dirX = Main.npc[(int)npc.ai[1]].position.X + (float)(Main.npc[(int)npc.ai[1]].width / 2) - npcCenter.X;
float dirY = Main.npc[(int)npc.ai[1]].position.Y + (float)(Main.npc[(int)npc.ai[1]].height / 2) - npcCenter.Y;
npc.rotation = (float)Math.Atan2(dirY, dirX) + 1.57f;
float length = (float)Math.Sqrt(dirX * dirX + dirY * dirY);
float dist = (length - (float)npc.width) / length;
float posX = dirX * dist;
float posY = dirY * dist;
npc.velocity = Vector2.Zero;
npc.position.X = npc.position.X + posX;
npc.position.Y = npc.position.Y + posY;
}
return false;
}
public override bool PreDraw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, Color drawColor)
{
Texture2D texture = Main.npcTexture[npc.type];
Vector2 origin = new Vector2(texture.Width * 0.5f, texture.Height * 0.5f);
Main.spriteBatch.Draw(texture, npc.Center - Main.screenPosition, new Rectangle?(), drawColor, npc.rotation, origin, npc.scale, SpriteEffects.None, 0);
return false;
}
public override bool? DrawHealthBar(byte hbPosition, ref float scale, ref Vector2 position)
{
return false;
}
}
}