hamstar
Terrarian
Closer Pets
v1.0.2
v1.0.2
Forces pets to follow closer to the player, even while traveling at high speeds. Source code:
Code:using Microsoft.Xna.Framework; using System.ComponentModel; using Terraria; using Terraria.ID; using Terraria.ModLoader; using Terraria.ModLoader.Config; namespace CloserPets { class CloserPets : Mod { public CloserPets() { } } class CloserPetsConfig : ModConfig { public override ConfigScope Mode => ConfigScope.ClientSide; [DefaultValue( true )] public bool Enabled { get; set; } = true; } class CloserPetsProjectile : GlobalProjectile { public override bool CloneNewInstances => false; //////////////// public override void SetDefaults( Projectile projectile ) { base.SetDefaults( projectile ); if( !ModContent.GetInstance<CloserPetsConfig>().Enabled ) { return; } switch( projectile.type ) { case ProjectileID.Truffle: case ProjectileID.Bunny: case ProjectileID.BabyDino: case ProjectileID.Penguin: case ProjectileID.BabyFaceMonster: case ProjectileID.BabySkeletronHead: case ProjectileID.Parrot: case ProjectileID.Turtle: case ProjectileID.BabySnowman: case ProjectileID.BabyEater: case ProjectileID.BabyHornet: case ProjectileID.PetLizard: case ProjectileID.Sapling: case ProjectileID.TikiSpirit: case ProjectileID.EyeSpring: case ProjectileID.Squashling: case ProjectileID.BlackCat: case ProjectileID.CursedSapling: case ProjectileID.Spider: case ProjectileID.Puppy: case ProjectileID.BabyGrinch: case ProjectileID.MiniMinotaur: case ProjectileID.ZephyrFish: case ProjectileID.DD2PetDragon: case ProjectileID.DD2PetGato: case ProjectileID.CompanionCube: projectile.ignoreWater = true; break; default: if( Main.projPet[projectile.type] && !ProjectileID.Sets.LightPet[projectile.type] ) { projectile.ignoreWater = true; } break; } } //////////////// public override void AI( Projectile projectile ) { if( !ModContent.GetInstance<CloserPetsConfig>().Enabled ) { return; } switch( projectile.type ) { case ProjectileID.Truffle: break; case ProjectileID.Bunny: case ProjectileID.BabyDino: case ProjectileID.Penguin: case ProjectileID.BabyFaceMonster: case ProjectileID.BabySkeletronHead: case ProjectileID.Parrot: case ProjectileID.Turtle: case ProjectileID.BabySnowman: case ProjectileID.BabyEater: case ProjectileID.BabyHornet: case ProjectileID.PetLizard: case ProjectileID.Sapling: case ProjectileID.TikiSpirit: case ProjectileID.EyeSpring: case ProjectileID.Squashling: case ProjectileID.BlackCat: case ProjectileID.CursedSapling: case ProjectileID.Spider: case ProjectileID.Puppy: case ProjectileID.BabyGrinch: case ProjectileID.MiniMinotaur: case ProjectileID.ZephyrFish: case ProjectileID.DD2PetDragon: case ProjectileID.DD2PetGato: case ProjectileID.CompanionCube: this.ConstrainProximity( projectile ); break; default: if( Main.projPet[projectile.type] && !ProjectileID.Sets.LightPet[projectile.type] ) { this.ConstrainProximity( projectile ); } break; } } //////////////// private void ConstrainProximity( Projectile projectile ) { Player plr = Main.player[projectile.owner]; if( plr == null || !plr.active ) { return; } float threshold = 16f * 32f; // 32 blocks float dist = Vector2.Distance( projectile.position, plr.position ); if( dist > threshold ) { float targetVel = plr.velocity.Length(); if( projectile.type == ProjectileID.ZephyrFish ) { targetVel += targetVel * 2f; // Aims to travel 50% faster than the player } else { targetVel += targetVel * 0.25f; // Aims to travel 25% faster than the player } Vector2 aimed = Vector2.Normalize( plr.position - projectile.position ) * targetVel; if( aimed.Length() > projectile.velocity.Length() ) { float lerp = ( dist - threshold ) / ( threshold * 4 ); // Acceleration increases if further away projectile.velocity = Vector2.Lerp( projectile.velocity, aimed, lerp ); } } } } }
Last edited: