Decimation_Mod/Content/Items/Accessories/Trinity/Trinity.cs
2020-07-13 15:22:20 -04:00

149 lines
5.7 KiB
C#

using System.Collections.Generic;
using Decimation.Lib.Util;
using Microsoft.Xna.Framework;
using Terraria;
using Terraria.ID;
using Terraria.ModLoader;
using Terraria.UI.Chat;
namespace Decimation.Content.Items.Accessories.Trinity
{
public class Trinity : TrinityAccessory
{
protected override string ItemName => "The Trinity";
protected override string ItemTooltip => "True Equilibrium...\n" +
"Increases maximum life by 50\n" +
"Increases maximum mana by 50\n" +
"Increases all damage by 10%\n" +
"Increases all critical hit chances by 10%\n" +
"Increases minions knockback by 10%\n" +
"Allows you to see nearby danger sources\n" +
"Shows the location of treasure and ore\n" +
"Criticals hits leech mana\n" +
"Hostile projectiles have 10% chance to phase through you,\nnegating all damage and causing your next attack to be a critical hit\n" +
"Hostile projectiles have 10% chance to ricochet off you\nand target your enemies with 50% increased damage";
protected override void InitAccessory()
{
item.width = 34;
item.height = 28;
item.expert = true;
item.value = Item.sellPrice(gold: 15);
}
public override void UpdateAccessory(Player player, bool hideVisual)
{
// Soul
player.statManaMax2 += 50;
player.magicDamage *= 1.10f;
player.magicCrit *= (int) (player.magicCrit * 1.10f);
player.minionDamage *= 1.10f;
player.minionKB *= 1.10f;
// Body
player.statLifeMax2 += 50;
player.meleeDamage *= 1.10f;
player.meleeCrit = (int) (player.meleeCrit * 1.10f);
// Mind
player.pickSpeed *= 1.10f;
player.tileSpeed *= 1.10f;
player.rangedDamage *= 1.10f;
player.rangedCrit = (int) (player.rangedCrit * 1.10f);
player.thrownDamage *= 1.10f;
player.thrownCrit = (int) (player.thrownCrit * 1.10f);
player.AddBuff(BuffID.Spelunker, 1);
player.AddBuff(BuffID.Dangersense, 1);
}
public override void ModifyTooltips(List<TooltipLine> tooltips)
{
tooltips.Add(new TooltipLine(mod, "trinity", "Trinity")
{
overrideColor = ChatManager.WaveColor(Color.Orange)
});
}
}
class TrinityItemEffects : GlobalItem
{
public override void OnHitNPC(Item item, Player player, NPC target, int damage, float knockBack, bool crit)
{
if (crit && player.GetModPlayer().HasEquippedAccessory(ModContent.ItemType<Trinity>()))
{
player.LeechMana(target);
}
}
public override void OnHitPvp(Item item, Player player, Player target, int damage, bool crit)
{
if (crit && player.GetModPlayer().HasEquippedAccessory(ModContent.ItemType<Trinity>()))
{
player.LeechMana(target);
}
}
}
class TrinityProjectileEffects : GlobalProjectile
{
public override void OnHitNPC(Projectile projectile, NPC target, int damage, float knockback, bool crit)
{
Player owner = Main.player[projectile.owner];
if (crit && owner != null && owner.active && !owner.dead &&
owner.GetModPlayer().HasEquippedAccessory(ModContent.ItemType<Trinity>()))
{
owner.LeechMana(target);
}
}
public override void OnHitPvp(Projectile projectile, Player target, int damage, bool crit)
{
Player owner = Main.player[projectile.owner];
if (crit && owner != null && owner.active && !owner.dead &&
owner.GetModPlayer().HasEquippedAccessory(ModContent.ItemType<Trinity>()))
{
owner.LeechMana(target);
}
}
public override void ModifyHitPvp(Projectile projectile, Player target, ref int damage, ref bool crit)
{
Ricochet(projectile, target, true, ref damage);
IgnoreHit(target, ref damage);
}
public override void ModifyHitPlayer(Projectile projectile, Player target, ref int damage, ref bool crit)
{
if (Ricochet(projectile, target, false, ref damage))
{
projectile.hostile = false;
projectile.friendly = true;
}
IgnoreHit(target, ref damage);
}
private bool Ricochet(Projectile projectile, Player player, bool fromPlayer, ref int damage)
{
if (Main.expertMode && Main.rand.NextBool(10) &&
player.GetModPlayer().HasEquippedAccessory(ModContent.ItemType<Trinity>()))
{
return projectile.Richochet(player, fromPlayer, ref damage);
}
return false;
}
private void IgnoreHit(Player target, ref int damage)
{
DecimationPlayer targetModPlayer = target.GetModPlayer();
if (Main.rand.NextBool(10) && targetModPlayer.HasEquippedAccessory(ModContent.ItemType<Soul>()))
{
damage = 0;
targetModPlayer.NextHitCrit = true;
}
}
}
}