Even More Modifiers  1.0.0.0
A mod for rolling various bonus stats on items
ModifierDelegatorProjectile.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using Loot.Modifiers.Base;
6 using Terraria;
7 using Terraria.ModLoader;
8 
9 namespace Loot.Api.Delegators
10 {
11  // TODO rework, make it like other delegators
16  {
17  public override bool InstancePerEntity => true;
18  public override bool CloneNewInstances => true;
19 
20  public override GlobalProjectile Clone()
21  {
22  var clone = (ModifierDelegatorProjectile) MemberwiseClone();
23  clone.SnapshotDebuffChances = new List<(int type, int time, float chance)>(SnapshotDebuffChances);
24  return clone;
25  }
26 
27  public ModifierDelegatorProjectile GetInfo(Projectile projectile)
28  => projectile.GetGlobalProjectile<ModifierDelegatorProjectile>();
29 
30  public bool NeedsClear;
31  public bool FirstTick;
32  public float SnapshotHealthyFoesMulti = 1f;
33  public float SnapshotCritMulti = 1f;
34  public List<(int type, int time, float chance)> SnapshotDebuffChances = new List<(int type, int time, float chance)>();
35 
36  private void AttemptDebuff(Projectile projectile, Player target)
37  {
38  foreach (var x in SnapshotDebuffChances)
39  {
40  if (Main.rand.NextFloat() < x.chance)
41  {
42  target.AddBuff(x.type, x.time);
43  }
44  }
45  }
46 
47  private void AttemptDebuff(Projectile projectile, NPC target)
48  {
49  foreach (var x in SnapshotDebuffChances)
50  {
51  if (Main.rand.NextFloat() < x.chance)
52  {
53  target.AddBuff(x.type, x.time);
54  }
55  }
56  }
57 
58  private void HealthyBonus(Projectile projectile, ref int damage, NPC target)
59  {
60  if (target.life == target.lifeMax)
61  {
62  damage = (int) Math.Ceiling(damage * SnapshotHealthyFoesMulti);
63  }
64  }
65 
66  private void HealthyBonus(Projectile projectile, ref int damage, Player target)
67  {
68  if (target.statLife == target.statLifeMax2)
69  {
70  damage = (int) Math.Ceiling(damage * SnapshotHealthyFoesMulti);
71  }
72  }
73 
74  private void CritBonus(Projectile projectile, ref int damage, bool crit)
75  {
76  if (crit)
77  {
78  damage = (int) Math.Ceiling(damage * GetInfo(projectile).SnapshotCritMulti);
79  }
80  }
81 
82  public override bool PreAI(Projectile projectile)
83  {
84  var mproj = GetInfo(projectile);
85  // On first tick, copy over player stats
86  if (!mproj.FirstTick)
87  {
88  mproj.FirstTick = true;
89 
90  // Snapshot current player values
91  if (projectile.owner != 255 && projectile.friendly && projectile.owner == Main.myPlayer)
92  {
93  var mplr = Main.LocalPlayer.GetModPlayer<ModifierDelegatorPlayer>();
94  mproj.SnapshotDebuffChances = mplr.GetEffect<WeaponDebuffEffect>().DebuffChances.ToList();
95  mproj.SnapshotHealthyFoesMulti = mplr.GetEffect<HealthyFoesEffect>().Multiplier;
96  if (!projectile.minion) // minions do not crit
97  {
98  mproj.SnapshotCritMulti = mplr.GetEffect<CritDamagePlusEffect>().Multiplier;
99  }
100  }
101  else if (projectile.owner == 255)
102  {
103  // TODO snapshot npc values. possible?
104  }
105  }
106 
107  if (NeedsClear)
108  {
109  mproj.SnapshotHealthyFoesMulti = 1f;
110  mproj.SnapshotDebuffChances.Clear();
111  }
112 
113  return base.PreAI(projectile);
114  }
115 
116  // TODO I hate the copy pasta
117 
118  public override void ModifyHitNPC(Projectile projectile, NPC target, ref int damage, ref float knockback, ref bool crit, ref int hitDirection)
119  {
120  HealthyBonus(projectile, ref damage, target);
121  CritBonus(projectile, ref damage, crit);
122  base.ModifyHitNPC(projectile, target, ref damage, ref knockback, ref crit, ref hitDirection);
123  }
124 
125  // shouldn't run
126  public override void ModifyHitPlayer(Projectile projectile, Player target, ref int damage, ref bool crit)
127  {
128  HealthyBonus(projectile, ref damage, target);
129  CritBonus(projectile, ref damage, crit);
130  base.ModifyHitPlayer(projectile, target, ref damage, ref crit);
131  }
132 
133  public override void ModifyHitPvp(Projectile projectile, Player target, ref int damage, ref bool crit)
134  {
135  HealthyBonus(projectile, ref damage, target);
136  CritBonus(projectile, ref damage, crit);
137  base.ModifyHitPvp(projectile, target, ref damage, ref crit);
138  }
139 
140  public override void OnHitNPC(Projectile projectile, NPC target, int damage, float knockback, bool crit)
141  {
142  AttemptDebuff(projectile, target);
143  base.OnHitNPC(projectile, target, damage, knockback, crit);
144  }
145 
146  public override void OnHitPlayer(Projectile projectile, Player target, int damage, bool crit)
147  {
148  AttemptDebuff(projectile, target);
149  base.OnHitPlayer(projectile, target, damage, crit);
150  }
151 
152  public override void OnHitPvp(Projectile projectile, Player target, int damage, bool crit)
153  {
154  AttemptDebuff(projectile, target);
155  base.OnHitPvp(projectile, target, damage, crit);
156  }
157  }
158 }
void AttemptDebuff(Projectile projectile, Player target)
override void OnHitPlayer(Projectile projectile, Player target, int damage, bool crit)
void CritBonus(Projectile projectile, ref int damage, bool crit)
void AttemptDebuff(Projectile projectile, NPC target)
override void ModifyHitNPC(Projectile projectile, NPC target, ref int damage, ref float knockback, ref bool crit, ref int hitDirection)
override void OnHitNPC(Projectile projectile, NPC target, int damage, float knockback, bool crit)
override void ModifyHitPlayer(Projectile projectile, Player target, ref int damage, ref bool crit)
void HealthyBonus(Projectile projectile, ref int damage, Player target)
void HealthyBonus(Projectile projectile, ref int damage, NPC target)
override void ModifyHitPvp(Projectile projectile, Player target, ref int damage, ref bool crit)
Holds player-entity data and handles it
override void OnHitPvp(Projectile projectile, Player target, int damage, bool crit)