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; } }
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; } } }
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; } }
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); }
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)); }
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; } }
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; } } }
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; } }
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; } }
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)); }
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); }
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(); } }
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; } }
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); }
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; } }
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; } } }
public static void PuriumShieldChargeMax(Player player, int points) { BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(Bluemagic.Instance); modPlayer.puriumShieldChargeMax += 100 * points; }
public static void ThrownCost(Player player, int points) { BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(Bluemagic.Instance); modPlayer.thrownCost += 0.08f * points; }
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; } } } }
public static void LifeRegen2(Player player, int points) { BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(Bluemagic.Instance); modPlayer.cancelBadRegen += 4 * points; }
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); } } }
public static void PuriumShieldFillRate(Player player, int points) { BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(Bluemagic.Instance); modPlayer.puriumShieldChargeRate += 0.1f * points; }
public static void PuriumShieldEnduranceMult(Player player, int points) { BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(Bluemagic.Instance); modPlayer.puriumShieldEnduranceMult += 0.1f * points; }
public override bool CanUseItem(Player player) { BluemagicPlayer modPlayer = player.GetModPlayer <BluemagicPlayer>(); return(player.extraAccessory && !modPlayer.extraAccessory2); }
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; } } }
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; } } }