summaryrefslogtreecommitdiff
path: root/Valheim_v0.141.2_r202102/Valheim/assembly_valheim/SEMan.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Valheim_v0.141.2_r202102/Valheim/assembly_valheim/SEMan.cs')
-rw-r--r--Valheim_v0.141.2_r202102/Valheim/assembly_valheim/SEMan.cs321
1 files changed, 321 insertions, 0 deletions
diff --git a/Valheim_v0.141.2_r202102/Valheim/assembly_valheim/SEMan.cs b/Valheim_v0.141.2_r202102/Valheim/assembly_valheim/SEMan.cs
new file mode 100644
index 0000000..6788e8b
--- /dev/null
+++ b/Valheim_v0.141.2_r202102/Valheim/assembly_valheim/SEMan.cs
@@ -0,0 +1,321 @@
+using System.Collections.Generic;
+
+public class SEMan
+{
+ protected List<StatusEffect> m_statusEffects = new List<StatusEffect>();
+
+ private List<StatusEffect> m_removeStatusEffects = new List<StatusEffect>();
+
+ private int m_statusEffectAttributes;
+
+ private Character m_character;
+
+ private ZNetView m_nview;
+
+ public SEMan(Character character, ZNetView nview)
+ {
+ m_character = character;
+ m_nview = nview;
+ m_nview.Register<string, bool>("AddStatusEffect", RPC_AddStatusEffect);
+ }
+
+ public void OnDestroy()
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.OnDestroy();
+ }
+ m_statusEffects.Clear();
+ }
+
+ public void ApplyStatusEffectSpeedMods(ref float speed)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifySpeed(ref speed);
+ }
+ }
+
+ public void ApplyDamageMods(ref HitData.DamageModifiers mods)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifyDamageMods(ref mods);
+ }
+ }
+
+ public void Update(float dt)
+ {
+ m_statusEffectAttributes = 0;
+ int count = m_statusEffects.Count;
+ for (int i = 0; i < count; i++)
+ {
+ StatusEffect statusEffect = m_statusEffects[i];
+ statusEffect.UpdateStatusEffect(dt);
+ if (statusEffect.IsDone())
+ {
+ m_removeStatusEffects.Add(statusEffect);
+ }
+ else
+ {
+ m_statusEffectAttributes |= (int)statusEffect.m_attributes;
+ }
+ }
+ if (m_removeStatusEffects.Count > 0)
+ {
+ foreach (StatusEffect removeStatusEffect in m_removeStatusEffects)
+ {
+ removeStatusEffect.Stop();
+ m_statusEffects.Remove(removeStatusEffect);
+ }
+ m_removeStatusEffects.Clear();
+ }
+ m_nview.GetZDO().Set("seAttrib", m_statusEffectAttributes);
+ }
+
+ public StatusEffect AddStatusEffect(string name, bool resetTime = false)
+ {
+ if (m_nview.IsOwner())
+ {
+ return Internal_AddStatusEffect(name, resetTime);
+ }
+ m_nview.InvokeRPC("AddStatusEffect", name, resetTime);
+ return null;
+ }
+
+ private void RPC_AddStatusEffect(long sender, string name, bool resetTime)
+ {
+ if (m_nview.IsOwner())
+ {
+ Internal_AddStatusEffect(name, resetTime);
+ }
+ }
+
+ private StatusEffect Internal_AddStatusEffect(string name, bool resetTime)
+ {
+ StatusEffect statusEffect = GetStatusEffect(name);
+ if ((bool)statusEffect)
+ {
+ if (resetTime)
+ {
+ statusEffect.ResetTime();
+ }
+ return null;
+ }
+ StatusEffect statusEffect2 = ObjectDB.instance.GetStatusEffect(name);
+ if (statusEffect2 == null)
+ {
+ return null;
+ }
+ return AddStatusEffect(statusEffect2);
+ }
+
+ public StatusEffect AddStatusEffect(StatusEffect statusEffect, bool resetTime = false)
+ {
+ StatusEffect statusEffect2 = GetStatusEffect(statusEffect.name);
+ if ((bool)statusEffect2)
+ {
+ if (resetTime)
+ {
+ statusEffect2.ResetTime();
+ }
+ return null;
+ }
+ if (!statusEffect.CanAdd(m_character))
+ {
+ return null;
+ }
+ StatusEffect statusEffect3 = statusEffect.Clone();
+ m_statusEffects.Add(statusEffect3);
+ statusEffect3.Setup(m_character);
+ if (m_character.IsPlayer())
+ {
+ GoogleAnalyticsV4.instance.LogEvent("Game", "StatusEffect", statusEffect.name, 0L);
+ }
+ return statusEffect3;
+ }
+
+ public bool RemoveStatusEffect(StatusEffect se, bool quiet = false)
+ {
+ return RemoveStatusEffect(se.name, quiet);
+ }
+
+ public bool RemoveStatusEffect(string name, bool quiet = false)
+ {
+ for (int i = 0; i < m_statusEffects.Count; i++)
+ {
+ StatusEffect statusEffect = m_statusEffects[i];
+ if (statusEffect.name == name)
+ {
+ if (quiet)
+ {
+ statusEffect.m_stopMessage = "";
+ }
+ statusEffect.Stop();
+ m_statusEffects.Remove(statusEffect);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public bool HaveStatusEffectCategory(string cat)
+ {
+ if (cat.Length == 0)
+ {
+ return false;
+ }
+ for (int i = 0; i < m_statusEffects.Count; i++)
+ {
+ StatusEffect statusEffect = m_statusEffects[i];
+ if (statusEffect.m_category.Length > 0 && statusEffect.m_category == cat)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public bool HaveStatusAttribute(StatusEffect.StatusAttribute value)
+ {
+ if (!m_nview.IsValid())
+ {
+ return false;
+ }
+ if (m_nview.IsOwner())
+ {
+ return ((uint)m_statusEffectAttributes & (uint)value) != 0;
+ }
+ return ((uint)m_nview.GetZDO().GetInt("seAttrib") & (uint)value) != 0;
+ }
+
+ public bool HaveStatusEffect(string name)
+ {
+ for (int i = 0; i < m_statusEffects.Count; i++)
+ {
+ if (m_statusEffects[i].name == name)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public List<StatusEffect> GetStatusEffects()
+ {
+ return m_statusEffects;
+ }
+
+ public StatusEffect GetStatusEffect(string name)
+ {
+ for (int i = 0; i < m_statusEffects.Count; i++)
+ {
+ StatusEffect statusEffect = m_statusEffects[i];
+ if (statusEffect.name == name)
+ {
+ return statusEffect;
+ }
+ }
+ return null;
+ }
+
+ public void GetHUDStatusEffects(List<StatusEffect> effects)
+ {
+ for (int i = 0; i < m_statusEffects.Count; i++)
+ {
+ StatusEffect statusEffect = m_statusEffects[i];
+ if ((bool)statusEffect.m_icon)
+ {
+ effects.Add(statusEffect);
+ }
+ }
+ }
+
+ public void ModifyNoise(float baseNoise, ref float noise)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifyNoise(baseNoise, ref noise);
+ }
+ }
+
+ public void ModifyRaiseSkill(Skills.SkillType skill, ref float multiplier)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifyRaiseSkill(skill, ref multiplier);
+ }
+ }
+
+ public void ModifyStaminaRegen(ref float staminaMultiplier)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifyStaminaRegen(ref staminaMultiplier);
+ }
+ }
+
+ public void ModifyHealthRegen(ref float regenMultiplier)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifyHealthRegen(ref regenMultiplier);
+ }
+ }
+
+ public void ModifyMaxCarryWeight(float baseLimit, ref float limit)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifyMaxCarryWeight(baseLimit, ref limit);
+ }
+ }
+
+ public void ModifyStealth(float baseStealth, ref float stealth)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifyStealth(baseStealth, ref stealth);
+ }
+ }
+
+ public void ModifyAttack(Skills.SkillType skill, ref HitData hitData)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifyAttack(skill, ref hitData);
+ }
+ }
+
+ public void ModifyRunStaminaDrain(float baseDrain, ref float drain)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifyRunStaminaDrain(baseDrain, ref drain);
+ }
+ if (drain < 0f)
+ {
+ drain = 0f;
+ }
+ }
+
+ public void ModifyJumpStaminaUsage(float baseStaminaUse, ref float staminaUse)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.ModifyJumpStaminaUsage(baseStaminaUse, ref staminaUse);
+ }
+ if (staminaUse < 0f)
+ {
+ staminaUse = 0f;
+ }
+ }
+
+ public void OnDamaged(HitData hit, Character attacker)
+ {
+ foreach (StatusEffect statusEffect in m_statusEffects)
+ {
+ statusEffect.OnDamaged(hit, attacker);
+ }
+ }
+}