From 5f231db511fd3449635414990860f6e662368a40 Mon Sep 17 00:00:00 2001 From: nathomp3 Date: Mon, 1 Nov 2021 22:36:48 -0400 Subject: [PATCH 1/3] Removed hardmode ore minions --- Items/AdamantiteStaff.png | Bin 745 -> 0 bytes Items/CobaltStaff.png | Bin 745 -> 0 bytes Items/MythrilStaff.png | Bin 744 -> 0 bytes Items/OrichalcumStaff.png | Bin 745 -> 0 bytes Items/PalladiumStaff.png | Bin 746 -> 0 bytes Items/TitaniumStaff.png | Bin 743 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Items/AdamantiteStaff.png delete mode 100644 Items/CobaltStaff.png delete mode 100644 Items/MythrilStaff.png delete mode 100644 Items/OrichalcumStaff.png delete mode 100644 Items/PalladiumStaff.png delete mode 100644 Items/TitaniumStaff.png diff --git a/Items/AdamantiteStaff.png b/Items/AdamantiteStaff.png deleted file mode 100644 index 03877cdefeca6f4d2531f37f58e6009f0681e1ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcmVEX>4Tx04R}tkv&MmKpe$iQ>9ue4i*$q$WUFhAS&W0RV;#q(pG5I!Q|2}Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOing&)J{M>obKX6muzVhXO~>mDAy-i3LV`?)_ykCHVR;1P-Em~L3a8^kl4 zmd<&fILHc;LVQjFVkVS#4`jZ|WuI7lq!+gNU6RxniJY2uKgYLqXe z8?12N;;fb`ta(rV!a!DANphX$5TaN@3~`8%Q9%(USP0Xqkzyi2`wUyM6+ApMfi_{fxdT1N7Yj{y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvPK7Ze-cJRCj%000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0002MNklumurWt=4N6DJ4!#ob>|Gi992!9AP=@Ca89Jj0a&TX1E-R$K|N2bT`) z#iasAaB09%Tncao7Y>}og#tZrVL&fj2+$Mf4)n&k0wZv4z$lyxFcLQnjK)m?GjPMe zEZh(<6W0yQ#&rQJaLvFfTobSocM7b=9Rd|_yFeA(U!W3h160F(0Tpp?pehc)lyLwT bWgNf?C0>{$7#yR)00000NkvXXu0mjf{-`d@ diff --git a/Items/CobaltStaff.png b/Items/CobaltStaff.png deleted file mode 100644 index 87cd69884399bd2d395a9e7cd7338fb499a06e94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcmVEX>4Tx04R}tkv&MmKpe$iQ>9ue4i*$q$WUFhAS&W0RV;#q(pG5I!Q|2}Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOing&)J{M>obKX6muzVhXO~>mDAy-i3LV`?)_ykCHVR;1P-Em~L3a8^kl4 zmd<&fILHc;LVQjFVkVS#4`jZ|WuI7lq!+gNU6RxniJY2uKgYLqXe z8?12N;;fb`ta(rV!a!DANphX$5TaN@3~`8%Q9%(USP0Xqkzyi2`wUyM6+ApMfi_{fxdT1N7Yj{y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvPK7ZNxt0m{k%000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0002MNklWt=4N6DJ4!#l0RkGi992!9AP=@Ca89Jj0a&TX1E-R$K|N2bT`) z#iasAaB09%Tncao7Y>}og#tZrVL&fj2+$Mf4)n&k0wZv4z$lyxFcLQnjK)m?GjPMe zEZh(<6W0yQ#&rQJaLvFfTobSocM7b=9Rd|_yFeA(U!W3h160F(0Tpp?pehc)lyLwT bWgNf?J$RU~F1Px|00000NkvXXu0mjf?ddYw diff --git a/Items/MythrilStaff.png b/Items/MythrilStaff.png deleted file mode 100644 index 495482989cf8dcfc494a53f7f220238061f29b48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 744 zcmVP)EX>4Tx04R}tkv&MmKpe$iQ>9ue4i*$q$WUFhAS&W0RV;#q(pG5I!Q|2}Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOing&)J{M>obKX6muzVhXO~>mDAy-i3LV`?)_ykCHVR;1P-Em~L3a8^kl4 zmd<&fILHc;LVQjFVkVS#4`jZ|WuI7lq!+gNU6RxniJY2uKgYLqXe z8?12N;;fb`ta(rV!a!DANphX$5TaN@3~`8%Q9%(USP0Xqkzyi2`wUyM6+ApMfi_{fxdT1N7Yj{y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvPK7ZVH_CX>@2HM@dakSAh-}0002LNklxp5CqX)0w7*23@qX$0m-8PA?Y7` zOh@pl4biT*`vPFfI7#3qP7e5sdp#d!$~c*WdpHT;5w09~hARcO;L3olxDsFwE*;p5 zO9hVL(txA56yOXl95{;$1$yAZfL^!|peN29=#6s)M&R6lQ8*W1ByJiQjhg~y;D&)& zxFKLBt{a$*>jGBbnt@fgCSWD*6j+Tr1S;TmfhxGaKqcG;sD}FjD&pQiRUCjR;{Yzo aIDi%0m6$M+l!8S70000EX>4Tx04R}tkv&MmKpe$iQ>9ue4i*$q$WUFhAS&W0RV;#q(pG5I!Q|2}Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOing&)J{M>obKX6muzVhXO~>mDAy-i3LV`?)_ykCHVR;1P-Em~L3a8^kl4 zmd<&fILHc;LVQjFVkVS#4`jZ|WuI7lq!+gNU6RxniJY2uKgYLqXe z8?12N;;fb`ta(rV!a!DANphX$5TaN@3~`8%Q9%(USP0Xqkzyi2`wUyM6+ApMfi_{fxdT1N7Yj{y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvPK7ZV^Mc4OTD000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0002MNklxp5CqX)q96_|^0%;vgDfPE0)(W0 z>@gj|t2RV?ULOm9DdQx8pEx<-FYflbnD166SVri=r) bDB}QDuV9&k9EBym00000NkvXXu0mjfmxej+ diff --git a/Items/PalladiumStaff.png b/Items/PalladiumStaff.png deleted file mode 100644 index 8112dd9117f4911c29dad53ec7da382693f0411e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 746 zcmVEX>4Tx04R}tkv&MmKpe$iQ>9ue4i*$q$WUFhAS&W0RV;#q(pG5I!Q|2}Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOing&)J{M>obKX6muzVhXO~>mDAy-i3LV`?)_ykCHVR;1P-Em~L3a8^kl4 zmd<&fILHc;LVQjFVkVS#4`jZ|WuI7lq!+gNU6RxniJY2uKgYLqXe z8?12N;;fb`ta(rV!a!DANphX$5TaN@3~`8%Q9%(USP0Xqkzyi2`wUyM6+ApMfi_{fxdT1N7Yj{y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvPK7ZW$4rREv{000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0002NNklO3n2M9_2 z(8DVQ_mm;p^L||bOc^H${KUxte{r|R%S;(3b8rtQ0X)K$1J7`!z!qE?uoYJV?7^i2 zdvU425nLK@6qf>=!G!~7aiKsDTo}*`7XtLexdXj%uD}SK8!!sz0*u5>1EXor{Fl8LT cMHvUM0(u&lURwl^^Z)<=07*qoM6N<$f`mCVBme*a diff --git a/Items/TitaniumStaff.png b/Items/TitaniumStaff.png deleted file mode 100644 index 984b19bd12fd981307840401d289c18a32b1328f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmV?P)EX>4Tx04R}tkv&MmKpe$iQ>9ue4i*$q$WUFhAS&W0RV;#q(pG5I!Q|2}Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOing&)J{M>obKX6muzVhXO~>mDAy-i3LV`?)_ykCHVR;1P-Em~L3a8^kl4 zmd<&fILHc;LVQjFVkVS#4`jZ|WuI7lq!+gNU6RxniJY2uKgYLqXe z8?12N;;fb`ta(rV!a!DANphX$5TaN@3~`8%Q9%(USP0Xqkzyi2`wUyM6+ApMfi_{fxdT1N7Yj{y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvPK7ZeM^iws%-000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0002KNkl%FEWx!Tk39tv34(!FH z0!MIZz)@TZa0V9+oW+F#J#b+_FI))F6Xy=}#<>C`aBjdToC`1#Hw}!&O#w4-!@w-u z5HJ(h4a~-M0V{CLz$#o5uo8C)ti~Mz6>z&i72IE-5^e)j!+il2ac`h14#1Rg02gH( ZzzWT^m)sQ3{eA!d002ovPDHLkV1k}!GTZ Date: Tue, 2 Nov 2021 17:20:45 -0400 Subject: [PATCH 2/3] Added chlorophyte minion --- Buffs/ChlorophyteBuff.cs | 32 ++++ Buffs/ChlorophyteBuff.png | Bin 0 -> 733 bytes Items/ChlorophyteStaff.cs | 54 ++++++ Items/HallowedStaff.cs | 4 +- Projectiles/ChlorophyteMinion.cs | 248 ++++++++++++++++++++++++++ Projectiles/ChlorophyteMinion.png | Bin 0 -> 14560 bytes Projectiles/ChlorophyteProjectile.cs | 109 +++++++++++ Projectiles/ChlorophyteProjectile.png | Bin 0 -> 9960 bytes Projectiles/SpectreMinion.cs | 3 +- 9 files changed, 446 insertions(+), 4 deletions(-) create mode 100644 Buffs/ChlorophyteBuff.cs create mode 100644 Buffs/ChlorophyteBuff.png create mode 100644 Items/ChlorophyteStaff.cs create mode 100644 Projectiles/ChlorophyteMinion.cs create mode 100644 Projectiles/ChlorophyteMinion.png create mode 100644 Projectiles/ChlorophyteProjectile.cs create mode 100644 Projectiles/ChlorophyteProjectile.png diff --git a/Buffs/ChlorophyteBuff.cs b/Buffs/ChlorophyteBuff.cs new file mode 100644 index 0000000..0e8a9ce --- /dev/null +++ b/Buffs/ChlorophyteBuff.cs @@ -0,0 +1,32 @@ +using Microsoft.Xna.Framework; +using System; +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; + +namespace DubNation.Buffs +{ + public class ChlorophyteBuff : ModBuff + { + public override void SetDefaults() + { + DisplayName.SetDefault("Chlorophyte Minion"); + Description.SetDefault("The chlorophyte minion will fight for you"); + Main.buffNoSave[Type] = true; + Main.buffNoTimeDisplay[Type] = true; + } + + public override void Update(Player player, ref int buffIndex) + { + if (player.ownedProjectileCounts[ModContent.ProjectileType()] > 0) + { + player.buffTime[buffIndex] = 18000; + } + else + { + player.DelBuff(buffIndex); + buffIndex--; + } + } + } +} diff --git a/Buffs/ChlorophyteBuff.png b/Buffs/ChlorophyteBuff.png new file mode 100644 index 0000000000000000000000000000000000000000..9e458cd71c7123b76c6aa68b7f4ec362cd0d5ccc GIT binary patch literal 733 zcmeAS@N?(olHy`uVBq!ia0vp^azHG>!VDzk-2-}n6id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE?7#PG0=Ijcz0ZJ$a_=LCuX&yT(l|*Be zPKHNqqEWA|~C-VkQtm0thaXVLR=WSyd_b=Xiysxj?lNAhjVGrMXE~ zRxbI;rManjC014eK&8bDhRgr&)(5H)M^fVnGR4ZuBQ-NUqlCf8$k5#6 zu=+E<`fouzZ58EiX;~rHa9Y|G%+wSu{d_T*%)X5gQu&X%Q~loCIB_4=1l+q literal 0 HcmV?d00001 diff --git a/Items/ChlorophyteStaff.cs b/Items/ChlorophyteStaff.cs new file mode 100644 index 0000000..b700596 --- /dev/null +++ b/Items/ChlorophyteStaff.cs @@ -0,0 +1,54 @@ +using Microsoft.Xna.Framework; +using System; +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; + +namespace DubNation.Items +{ + class ChlorophyteStaff : ModItem + { + public override void SetStaticDefaults() + { + DisplayName.SetDefault("Chlorophyte Staff"); + Tooltip.SetDefault("Summons a chlorophyte minion to fight for you."); + ItemID.Sets.GamepadWholeScreenUseRange[item.type] = true; + ItemID.Sets.LockOnIgnoresCollision[item.type] = true; + } + + public override void SetDefaults() + { + item.damage = 10; + item.width = 40; + item.height = 40; + item.useTime = 36; + item.useAnimation = 36; + item.useStyle = ItemUseStyleID.SwingThrow; + item.value = 10; + item.rare = ItemRarityID.Blue; + item.UseSound = SoundID.Item1; + item.mana = 10; + item.noMelee = true; + item.summon = true; + item.buffType = ModContent.BuffType(); + item.shoot = ModContent.ProjectileType(); + } + + public override bool Shoot(Player player, ref Vector2 position, ref float speedX, ref float speedY, ref int type, ref int damage, ref float knockBack) + { + player.AddBuff(item.buffType, 2); + position = Main.MouseWorld; + return true; + } + + public override void AddRecipes() + { + ModRecipe recipe = new ModRecipe(mod); + recipe.AddIngredient(ItemID.ChlorophyteBar, 9); + recipe.AddIngredient(ItemID.TurtleShell, 1); + recipe.AddTile(TileID.MythrilAnvil); + recipe.SetResult(this); + recipe.AddRecipe(); + } + } +} diff --git a/Items/HallowedStaff.cs b/Items/HallowedStaff.cs index 6a76578..6c3fa41 100644 --- a/Items/HallowedStaff.cs +++ b/Items/HallowedStaff.cs @@ -44,8 +44,8 @@ public override bool Shoot(Player player, ref Vector2 position, ref float speedX public override void AddRecipes() { ModRecipe recipe = new ModRecipe(mod); - recipe.AddIngredient(ItemID.CopperBar, 9); - recipe.AddTile(TileID.Anvils); + recipe.AddIngredient(ItemID.HallowedBar, 8); + recipe.AddTile(TileID.MythrilAnvil); recipe.SetResult(this); recipe.AddRecipe(); } diff --git a/Projectiles/ChlorophyteMinion.cs b/Projectiles/ChlorophyteMinion.cs new file mode 100644 index 0000000..1c5ad73 --- /dev/null +++ b/Projectiles/ChlorophyteMinion.cs @@ -0,0 +1,248 @@ +using Microsoft.Xna.Framework; +using System; +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; + +namespace DubNation.Projectiles +{ + public class ChlorophyteMinion : ModProjectile + { + public override void SetStaticDefaults() + { + DisplayName.SetDefault("Chlorophyte"); + // Sets the amount of frames this minion has on its spritesheet + Main.projFrames[projectile.type] = 2; + // This is necessary for right-click targeting + ProjectileID.Sets.MinionTargettingFeature[projectile.type] = true; + + // These below are needed for a minion + // Denotes that this projectile is a pet or minion + Main.projPet[projectile.type] = true; + // This is needed so your minion can properly spawn when summoned and replaced when other minions are summoned + ProjectileID.Sets.MinionSacrificable[projectile.type] = true; + // Don't mistake this with "if this is true, then it will automatically home". It is just for damage reduction for certain NPCs + ProjectileID.Sets.Homing[projectile.type] = true; + } + + public sealed override void SetDefaults() + { + projectile.width = 72; + projectile.height = 44; + // Makes the minion go through tiles freely + projectile.tileCollide = false; + + // These below are needed for a minion weapon + // Only controls if it deals damage to enemies on contact (more on that later) + projectile.friendly = true; + // Only determines the damage type + projectile.minion = true; + // Amount of slots this minion occupies from the total minion slots available to the player (more on that later) + projectile.minionSlots = 1f; + // Needed so the minion doesn't despawn on collision with enemies or tiles + projectile.penetrate = -1; + } + + // Here you can decide if your minion breaks things like grass or pots + public override bool? CanCutTiles() + { + return false; + } + + // This is mandatory if your minion deals contact damage (further related stuff in AI() in the Movement region) + public override bool MinionContactDamage() + { + return false; + } + + int delay = 0; + public override void AI() + { + Player player = Main.player[projectile.owner]; + + #region Active check + // This is the "active check", makes sure the minion is alive while the player is alive, and despawns if not + if (player.dead || !player.active) + { + player.ClearBuff(ModContent.BuffType()); + } + if (player.HasBuff(ModContent.BuffType())) + { + projectile.timeLeft = 2; + } + #endregion + + #region General behavior + Vector2 idlePosition = player.Center; + idlePosition.Y -= 48f; // Go up 48 coordinates (three tiles from the center of the player) + + // If your minion doesn't aimlessly move around when it's idle, you need to "put" it into the line of other summoned minions + // The index is projectile.minionPos + float minionPositionOffsetX = (10 + projectile.minionPos * 40) * -player.direction; + idlePosition.X += minionPositionOffsetX; // Go behind the player + + // All of this code below this line is adapted from Spazmamini code (ID 388, aiStyle 66) + + // Teleport to player if distance is too big + Vector2 vectorToIdlePosition = idlePosition - projectile.Center; + float distanceToIdlePosition = vectorToIdlePosition.Length(); + if (Main.myPlayer == player.whoAmI && distanceToIdlePosition > 2000f) + { + // Whenever you deal with non-regular events that change the behavior or position drastically, make sure to only run the code on the owner of the projectile, + // and then set netUpdate to true + projectile.position = idlePosition; + projectile.velocity *= 0.1f; + projectile.netUpdate = true; + } + + // If your minion is flying, you want to do this independently of any conditions + float overlapVelocity = 0.04f; + for (int i = 0; i < Main.maxProjectiles; i++) + { + // Fix overlap with other minions + Projectile other = Main.projectile[i]; + if (i != projectile.whoAmI && other.active && other.owner == projectile.owner && Math.Abs(projectile.position.X - other.position.X) + Math.Abs(projectile.position.Y - other.position.Y) < projectile.width) + { + if (projectile.position.X < other.position.X) projectile.velocity.X -= overlapVelocity; + else projectile.velocity.X += overlapVelocity; + + if (projectile.position.Y < other.position.Y) projectile.velocity.Y -= overlapVelocity; + else projectile.velocity.Y += overlapVelocity; + } + } + #endregion + + #region Find target + // Starting search distance + float distanceFromTarget = 700f; + Vector2 targetCenter = projectile.position; + Vector2 targetBehind = projectile.position; + bool foundTarget = false; + + // This code is required if your minion weapon has the targeting feature + if (player.HasMinionAttackTargetNPC) + { + NPC npc = Main.npc[player.MinionAttackTargetNPC]; + float between = Vector2.Distance(npc.Center, projectile.Center); + // Reasonable distance away so it doesn't target across multiple screens + if (between < 2000f) + { + distanceFromTarget = between; + targetCenter = npc.Center; + targetBehind = npc.Center - new Vector2(npc.direction * 50, 30); + foundTarget = true; + } + } + if (!foundTarget) + { + // This code is required either way, used for finding a target + for (int i = 0; i < Main.maxNPCs; i++) + { + NPC npc = Main.npc[i]; + if (npc.CanBeChasedBy()) + { + float between = Vector2.Distance(npc.Center, projectile.Center); + bool closest = Vector2.Distance(projectile.Center, targetCenter) > between; + bool inRange = between < distanceFromTarget; + bool lineOfSight = Collision.CanHitLine(projectile.position, projectile.width, projectile.height, npc.position, npc.width, npc.height); + // Additional check for this specific minion behavior, otherwise it will stop attacking once it dashed through an enemy while flying though tiles afterwards + // The number depends on various parameters seen in the movement code below. Test different ones out until it works alright + bool closeThroughWall = between < 100f; + if (((closest && inRange) || !foundTarget) && (lineOfSight || closeThroughWall)) + { + distanceFromTarget = between; + targetCenter = npc.Center; + targetBehind = npc.Center - new Vector2(npc.direction * 50, 30); + foundTarget = true; + } + } + } + } + + // friendly needs to be set to true so the minion can deal contact damage + // friendly needs to be set to false so it doesn't damage things like target dummies while idling + // Both things depend on if it has a target or not, so it's just one assignment here + // You don't need this assignment if your minion is shooting things instead of dealing contact damage + projectile.friendly = foundTarget; + #endregion + + #region Attack + float projSpeed2 = 6f; + if (delay == 0) + { + projectile.frame = 0; + if (foundTarget) + { + delay = 120; + projectile.frame = 1; + Vector2 minionToProjectile = projectile.Center - targetCenter; + minionToProjectile.Normalize(); + minionToProjectile *= projSpeed2; + Vector2 velocity = -minionToProjectile; + Projectile.NewProjectile(projectile.Center, velocity, ModContent.ProjectileType(), 60, 8, projectile.owner); + } + } + else + { + projectile.frame = delay < 30 ? 0 : 1; + delay--; + } + #endregion + + #region Movement + // Default movement parameters (here for attacking) + float speed = 8f; + float inertia = 20f; + + if (foundTarget) + { + // The immediate range around the target (so it doesn't latch onto it when close) + Vector2 direction = targetBehind - projectile.Center; + direction.Normalize(); + direction *= speed; + projectile.velocity = (projectile.velocity * (inertia - 1) + direction) / inertia; + } + else + { + // Minion doesn't have a target: return to player and idle + if (distanceToIdlePosition > 600f) + { + // Speed up the minion if it's away from the player + speed = 12f; + inertia = 60f; + } + else + { + // Slow down the minion if closer to the player + speed = 4f; + inertia = 80f; + } + if (distanceToIdlePosition > 20f) + { + // The immediate range around the player (when it passively floats about) + + // This is a simple movement formula using the two parameters and its desired direction to create a "homing" movement + vectorToIdlePosition.Normalize(); + vectorToIdlePosition *= speed; + projectile.velocity = (projectile.velocity * (inertia - 1) + vectorToIdlePosition) / inertia; + } + else if (projectile.velocity == Vector2.Zero) + { + // If there is a case where it's not moving at all, give it a little "poke" + projectile.velocity.X = -0.15f; + projectile.velocity.Y = -0.05f; + } + } + #endregion + + #region Animation and visuals + // So it will lean slightly towards the direction it's moving + projectile.rotation = projectile.velocity.X * 0.05f; + + // Some visuals here + Lighting.AddLight(projectile.Center, Color.White.ToVector3() * 0.78f); + #endregion + + } + } +} diff --git a/Projectiles/ChlorophyteMinion.png b/Projectiles/ChlorophyteMinion.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae9622ccffc0e19882103619ef42d87537aff68 GIT binary patch literal 14560 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 KMNUMnLSTaK_u+8> literal 0 HcmV?d00001 diff --git a/Projectiles/ChlorophyteProjectile.cs b/Projectiles/ChlorophyteProjectile.cs new file mode 100644 index 0000000..1235d87 --- /dev/null +++ b/Projectiles/ChlorophyteProjectile.cs @@ -0,0 +1,109 @@ +using System; +using Microsoft.Xna.Framework; +using Terraria; +using Terraria.ID; +using Terraria.ModLoader; + +namespace DubNation.Projectiles +{ + class ChlorophyteProjectile : ModProjectile + { + public override void SetStaticDefaults() + { + Main.projPet[projectile.type] = true; + ProjectileID.Sets.Homing[projectile.type] = true; + } + + public override void SetDefaults() + { + projectile.width = 58; + projectile.height = 38; + projectile.friendly = true; + projectile.minion = true; + projectile.penetrate = -1; + projectile.timeLeft = 240; + projectile.ignoreWater = true; + projectile.tileCollide = false; + } + + public override bool MinionContactDamage() + { + return true; + } + + public override void AI() + { + #region Find target + // Starting search distance + float distanceFromTarget = 700f; + Vector2 targetCenter = projectile.position; + bool foundTarget = false; + Player player = Main.player[projectile.owner]; + // This code is required if your minion weapon has the targeting feature + if (player.HasMinionAttackTargetNPC) + { + NPC npc = Main.npc[player.MinionAttackTargetNPC]; + float between = Vector2.Distance(npc.Center, projectile.Center); + // Reasonable distance away so it doesn't target across multiple screens + if (between < 2000f) + { + distanceFromTarget = between; + targetCenter = npc.Center; + projectile.hide = false; + foundTarget = true; + } + } + if (!foundTarget) + { + projectile.hide = true; + // This code is required either way, used for finding a target + for (int i = 0; i < Main.maxNPCs; i++) + { + NPC npc = Main.npc[i]; + if (npc.CanBeChasedBy()) + { + float between = Vector2.Distance(npc.Center, projectile.Center); + bool closest = Vector2.Distance(projectile.Center, targetCenter) > between; + bool inRange = between < distanceFromTarget; + if ((closest && inRange) || !foundTarget) + { + distanceFromTarget = between; + targetCenter = npc.Center; + projectile.hide = false; + foundTarget = true; + } + } + } + } + #endregion + + #region Movement + // Default movement parameters (here for attacking) + float speed = 15f * projectile.timeLeft / 240; + float inertia = 20f; + if (foundTarget) + { + // The immediate range around the target (so it doesn't latch onto it when close) + if (distanceFromTarget > 20) + { + Vector2 direction = targetCenter - projectile.Center; + direction.Normalize(); + direction *= speed; + projectile.velocity = (projectile.velocity * (inertia - 1) + direction) / inertia; + } + } + #endregion + + #region Animation and visuals + if (projectile.ai[0]++ >= 360) + { + projectile.ai[0] = 0; + } + projectile.rotation = projectile.ai[0]/5; + // Some visuals here + Lighting.AddLight(projectile.Center, Color.White.ToVector3() * 0.78f); + #endregion + + } + } +} diff --git a/Projectiles/ChlorophyteProjectile.png b/Projectiles/ChlorophyteProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..fa023421af2fd57e45638f734597399d1536689e GIT binary patch literal 9960 zcmVP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3<}ksLXeMgJkih=6?&2di0YFyha-KqQ%DvAV0x zrf6hlMR>RaZ@CMAF#CW1b+8nn&l{eXg06i3TRtCfo!8UP4}3ktjbC3k_4AIepBuR!H-00~llA-hK1g2o?{ybH zH){L+l3Oj`hdMqtnx6~rP(FX-k72zZ`hWAw3xz1H#DjwOJGfx^*N4vtg8sVD`Ky0* z4dV@&-(#qTA1Tz&%?QXZ)BE~q?e_rv66CMn%o#0C2zj_4%ls+)P5fT& zpT?hRyPc$b*=YxVrfbfVm1A6V%XN3$zCWj%3^Drc3qQS|BucNx} zutFu5({B?3FZ&;3are3HK5x3plb7RC@3@)cBY*qH{JS^*n?L59sSr5@lhnJHV6VDn z7|NXfN~$Kc)N{x&r<`-i0=Zs7i6xa>N~xulUPFyF z)m%%hwbkBy3t(Vsxs_I1YrT8Zc~IwGo$EWV3_rq%BaJ-DsH2TODW4f77b>?CNG0Ou8Pl>|Flpyg3xLOH*R6VWvoq{vuX{<6RoaikXtYM77 zFBAyn>0%PO|AU|APj9&5m$!ANT1V()lo?Wb;jHGF2g&WZwd~HO%Fo(l&6_barCLt6 z8$4M0zg*wHYm~NjJS~lIN}Z!BYG*AUmQ92?QiFT;8q+j8@yk}cnk}b98;8qu zK^(0vw+awpn&pE&^pz*|0i_d#WGN50lnK#J?)xoIaW|&Xo*B|PkoTQ#H8AfvjygYo zp8K2n9!}zF_YwB4$L{Y>qIh;SV_SxL(qvA(%)=DU=&0M(sm^==2G?jP=gU5X<&_^`+++nUsX7{G9K%IK03v7e_ZuB}P02@7(!uSwa6n~{4 zKr3BEc&%BfOm3K`+xak=)egbl0faj7_EZA!BM4n0c?iNBVuQgK}gUR2|TfTfY=;$}9D`El8JA z-P;B5wt)IvM5N22Hd9^5Th}v1d`3At#!S?I&0ye`$wSX+JKZWqQ}D3W@O2|tnL8>}Y!bgiPc+}3sp&Hm z5QMnII#ZAjB)=<+?|4OA2anA?ukPV?G`us2jW=Q7FC*eWp_rR>ExOuLbrX)|mej&zBE*==-*#o%rcno@W<$t* z{w^6{T6>7-Qp|gd$$6R!O-D=}G+Eos~Jp(}D5lV`$L&1x|Tr%)T zy8-fhW{*EW(=kUTM!^+lvadjvPpF#MTaFIpf#pLoPIYO-9+1mkbgMXp@Wh?^MH&rK zl!+i%NQ@R$yw~-G;{?ElzyU`4tlSa4WhHuRl7?LC36KWjRrF2cQ$D)=DVvuO?5D!% zf?If5?AGtwy)FU7Z5j2>y04-|&!VCv@9tF#Fy2zlhF*ar1VsUDI_T3*SD=kxJ%Ux0 z!Bv>cgor3Y;bcLQLPphrlaSzj-@s&KxHUh9Y8c5psk-9fB;s+VrX?Xeu}YHY*oucr+U41V_W86>C~b7AV1pPDRA`MO5() z7b*_4;*SII+owUhgg!UO5spFDHgqO%H>xyjqug6E9uTERu&Emd0r}4YhS7P%b)rZh z;;I#lgTzp$*5O>g?z87NhVGHm%G(4tcq5PPSyuq3mcs(5iW;@BRHf#iLii6oY zFtYG*A`7z#fW0x zVjDh>4RSdmh~;}OSrc3U&QtuEScEcLgyvwGjnby8G1fp^PMv~;^R9=5pn-9(W{s0V z-xUtw$rU3t3jah*x+P;--7KJkA(DhHOhAAQer%&<$?ia>+vcx81mu82FfmaVgnW2v zma4B5h_mYBLm$f}P+?IklE#A}HK44ab&-2lMfxL+&^4b1G6akwLm?p>*32%(rd6yW zKZJY<8ldUL;fc_@h}e`77g*j!|7G|NEdzkzA2TisEH$D7QhaS~m=G zpOAu#8}AJCw}PhLBxl4f-91%#5`Rz zAcG4Q-5nVDlBVSjR2QHNKvPN+OI<{o?o5R+l}KezLpcY~tD%GE)QU64Z)Qudz)Z0{ zkpEpWi@wl&6d?`_V~Kh1+ z&`PBvTGT+OTKRb|r#w{!Lq3zBwymWRrUW}8zmZJLta@s=NpNSo`;BRkqJebEF)G!J z@S;2MP`F}`&?Gy;@nEOp&Teyf&72vh!97|9e3mC_}zNaHGg%Q0sHfv>D#l%X!E7zR{W zBd7oZ+~T#1)I);)gMnWHO`aaX_Xc~(hoPNjK7KgB_I>1egBohBp72zUoGk)uS>F8oz5ujkxGHwo~e zF8HNhFEt?@R2oV{`jXsWh?e={rAtfnTwCu3LBrvxYJ#Tb!Zq6pNkB=bMk(ajkdQ>= z;5*0~h{Dsc)AFKDL9KN3Z7!re9ILgBk>jENCun9FR}?Z+p$xdJEv7;Fqa@*Q21afm zD@Yl_4P#uOKpg;3V7;xvKbLP!M;H!=;2AY_Bb=dWK`VKjNsUb10Lu=l46W2KQfeT= zDUL@6pf7?PeSj64wkGQI5uIU$?FMN@!aZso=+t|<5iB?016WoIZ`@pjDbYxFwOVW+ z9;9n_pg_>abT}r->A0!(?FTi~YWc#)xW&Mu$5Cs;oZ~Q%$u z3@+{+ED9hpC+*mA9lRk27$R=2HiD(~kI|lpCI^UDo+Dk4h9vDv26kXAvA4yeA7-Se zdlfjz=^@%t^+`Aaj$%0Q4_meev&?JY!^uWVvC5g`@fGL0;`C@JEG)*7AQMo?7NJ3U zv%mtS1!+TrLi?}_+&!}iWIP9?5N55IQ{3{BGE2OI*!J5 z*DEzzBw8&Dg(_;)nkqnqOT{AM;Fw55tb!t-CZalYd;A2KeN$?^qvj$svu8I?Z~`cz zo|{&LR~&FCVF!QOFDe5T6bfnm*fEx*xq-qiMT6yOC`73&h%WJ2N?Q93ZFkw_=-X}b z=A9NbJCaUhtgUYZ`st3sMSDc!Jcg`VM{U9R*b7)_pRN{0c0f%%Dfe^`!c!@J-T)y; z8KT6!M~{SAQEZ;H;KL3RNK~ts1lr>6+Jm*uk~i5z-_bQAPmngyfQUytUd$l>>@<%7 zyuk$qgXCjom@h5V2FzwHPNuyetPop*blfI|?JS??Ic}8(7*R#Ev^Q4M96a5lP9V;F z6s9bqE&2m8pvp+JC&?E)nyds`4Du?#D)W*DG+Lq95xpk0xa1W}Q67MCgr3422owa5 zEztrCrAazF222I03Xe2)$OfRgtCtWS4w0VVH>_1eD`^>kp3;6MK5-(8v(`(7ZOj?m zjX~5k63DnubK2BjiE)e^+17;NNFCwR{&eTf+{Pzkf zZ>!n?b}<7JUr8mLigpLI#2SIVhHtng)ij$Sx|7!Ptnx+Z9W7Ye66rhLuLNpQYd^Ze zzAI@*dq`KB4KbFRkyfOWnS~yU_sGj?btR-{0qwP+q=aO<4HXhAq_)HGn$-mqnSp_JbufR|)`&c{geJp<28SMiypamL85o5c zraH9vMUFih3;D?B#$-e!U(%CGRbkNc_tDp?2a&c^aRM!I*Qeje^!{ilp!zx$kN8Mt zT<+JB+>^TmSqy-SUr!6iH<_uK6C(sdPJejE=q;_qU@JQW+7lLlh-B?TjSV$IP>+C; zyh*tml+32%6OS&0qI6rcvG{tM!j}AF*j}~+XrZPr48ykvG}`0{u%V;-&dyiuK~jtT zj*A-!_7Kdc)jq<{5PSjvo4$(r#Y#Y&)G26RvCsuBwF@^^t(k-G&c z&~4(O;vEPa=hbwoKAx078m;QOZU{uBxdBGRmp0y|+*`089WB_A&J_Y(1J*~TW&sytPpD2MC+g?w;)pkvm9_o6)@BW0#uI! zrgXgvclRX%t0+zsavEd{sSNs->faD9t$vLG4LRal*$di`z4baVz4lg)m72UEkNC{D z1Z7>iOIDJ63pIpU(uN<#PfKOm$JMS-lvpRe@h}wlBWp1T*65{botTzs>OV{^@<`rW zD@Sy2M){Yd4Q{&GW9t8ii!E=sSAY-*I zt0mV95Lu47tSgwkSb$q4nPF60oifi_H0T%=IHM$wp0{2yCYaErsFKzx-NA~(BA6`{ zrg6y0hW&!gK?*jLpSaCt+JNNc)?IN*a(S`ae#bayqMDdGeYu#G`K z1JOVq95C?~;esLvx^maCSsU0A0CBDA#DQ3WWmQ)MdplKHD6Gzo<*{$pkgY9(YEA@uci4f*B9W-q4PRO~4 z+Smwv+Vk!agKsvAG^O6Vvg2X~O7YhgQIe3&T*B?KyIXsf(;#sf2>F5UN29y&`A7;+ zBpE-Vfz%M?UYbKiCMs^Ip>MZoRSWd+?EBGEN zA_c+Iw3|HWv@+3mSPjBu5i`!96m+);FLrirORRv^R-Ajl4$8VHK^Y&kP2m zhqG3!HrY!39X*9&dhjs8>OU*3(h z1}Qx0-@4!8ibvPi3n~KU0^){1_ zNoRNHo-$>++I{+G7`NGKnGOMv47s6Hl9q*vbG2G+3Dm61nMncPkJo|<6{b@Kbn%-SgNi!or{=sP{IH$iHNq0 z)_--5h#~6CkcZ8g5*0%MwJc3tAWkGk+Ijs>j|<&ewIp+*QMrPH3+x%wWmutB1db5O zsYLZ$;1rc65&qA12CJAgB$mC26fM?SN4bzl3=O_Q+@mk?!5{<0O&oHdO|NHY zxGKbytlB{?B#I-@4aG1Z&;_y6w2PUyRw7Gnv`Pg-$kw3wqSN7k%Vi{=Bu(Ur2 zQM5EL&AD;G_5fITMA#)jO-_~4&^7a^MlC)wfTANy%&zgcx0-VoPN_JoC=o~q5&9$% zz_Am6bWg=3EpfD6-{CPWBj^~$q7tO+im71Zds6Cr_U5d&0lh{$J!%8Ps9BHTxozrYOxL*V(* zCKjX)$ZQ>Rped+&11AgN)W19^)!NmX9pk61r9)D+FTu@S zM&eG27X+kteDGR`z*9-=+9fkuYp!I1dvo#B8*I&4Yp;-⋙6l`L2&76OkmggL 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 mtJVLeDbcegeOBaxC;Au4wUq(vn>=#>0000 Date: Tue, 2 Nov 2021 17:21:05 -0400 Subject: [PATCH 3/3] Updated version --- build.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.txt b/build.txt index 52ee32f..162bba7 100644 --- a/build.txt +++ b/build.txt @@ -1,4 +1,4 @@ displayName = DubNation author = Penguin -version = 0.2.9 +version = 0.2.10 homepage = https://github.com/Nick-NCSU/DubNationMod \ No newline at end of file