r2mods/ilspy_dump/ror2_csproj/RoR2/FalseSonController.cs

332 lines
7.9 KiB
C#
Raw Permalink Normal View History

2024-10-04 07:26:37 +00:00
using RoR2.Skills;
using UnityEngine;
using UnityEngine.Networking;
namespace RoR2;
[RequireComponent(typeof(CharacterBody))]
public class FalseSonController : NetworkBehaviour
{
public CharacterBody characterBody;
public SkillDef falseSonBodyTheTamperedHeart;
public SkillDef tempAltDefName;
public GenericSkill passiveSkillSlot;
[SerializeField]
private float tamperedHeartRegen;
[SerializeField]
private float tamperedHeartMoveSpeed;
[SerializeField]
private float tamperedHeartArmor;
[SerializeField]
private float tamperedHeartAttackSpeed;
private bool tamperedHeart;
private SkillLocator skillLocator;
private int maxSecondaryStock;
private int oldMaxSecondaryStock;
private int secondaryStock;
private int oldSecondaryStock;
private int extraShardFromHealth;
private int oldExtraShardFromHealth;
private float maxHealth;
private float oldMaxHealth;
private int bonusSecondarySkillCountFromItems;
private int oldBonusSecondarySkillCountFromItems;
private bool alreadyResetMaxSecondaryStockCount;
private int lunarSpikeSkillIndex;
private int laserBurstSkillIndex;
private GenericSkill lunarSpikeSkill;
private GenericSkill laserSpecialSkill;
private bool cachedEffectiveAuthority;
private NetworkIdentity networkIdentity;
private float clubSwingAltSecondaryTimestamp;
private static int kCmdCmdUpdateAmmoAmounts;
private bool secondarySkillIsFalseSonDefault => lunarSpikeSkill.baseSkill.skillIndex == lunarSpikeSkillIndex;
private bool sendAmmoUpdatesToServer
{
get
{
if (cachedEffectiveAuthority)
{
return !NetworkServer.active;
}
return false;
}
}
private void OnEnable()
{
skillLocator = GetComponent<SkillLocator>();
networkIdentity = skillLocator.GetComponent<NetworkIdentity>();
lunarSpikeSkill = skillLocator.GetSkill(SkillSlot.Secondary);
laserSpecialSkill = skillLocator.GetSkill(SkillSlot.Special);
CacheEffectiveAuthority();
oldMaxSecondaryStock = GetMaxSecondaryStock();
oldSecondaryStock = maxSecondaryStock;
lunarSpikeSkillIndex = SkillCatalog.FindSkillIndexByName("LunarSpikes");
laserBurstSkillIndex = SkillCatalog.FindSkillIndexByName("LaserBurst");
}
private void Update()
{
bool flag = false;
CacheEffectiveAuthority();
if (passiveSkillSlot.skillDef == falseSonBodyTheTamperedHeart)
{
if (!secondarySkillIsFalseSonDefault && !alreadyResetMaxSecondaryStockCount)
{
characterBody.extraSecondaryFromSkill = 0;
oldExtraShardFromHealth = 0;
UpdateStats();
alreadyResetMaxSecondaryStockCount = true;
}
maxHealth = characterBody.maxHealth;
maxSecondaryStock = GetMaxSecondaryStock();
if ((maxHealth != oldMaxHealth && characterBody.maxBonusHealth > 0f) || oldMaxSecondaryStock != maxSecondaryStock || (!secondarySkillIsFalseSonDefault ^ alreadyResetMaxSecondaryStockCount))
{
if (secondarySkillIsFalseSonDefault)
{
IncreaseStockCount();
flag = true;
alreadyResetMaxSecondaryStockCount = false;
}
oldMaxHealth = maxHealth;
oldMaxSecondaryStock = maxSecondaryStock;
}
secondaryStock = GetSecondaryStock();
if (secondaryStock != oldSecondaryStock || flag)
{
CalcTamperedHeartStats();
flag = true;
}
}
if (sendAmmoUpdatesToServer && flag)
{
CallCmdUpdateAmmoAmounts(secondaryStock, maxSecondaryStock);
}
}
[Command]
public void CmdUpdateAmmoAmounts(int _secondaryStock, int _maxSecondaryStock)
{
maxSecondaryStock = _maxSecondaryStock;
secondaryStock = _secondaryStock;
CalcTamperedHeartStats();
}
public int GetTotalSpikeCount()
{
int num = 0;
float num2 = 15f;
float num3 = 5f;
float num4 = characterBody.maxBonusHealth - (characterBody.baseMaxHealth + characterBody.levelMaxHealth * (float)((int)characterBody.level - 1));
int num5 = 10;
while (num4 > num2)
{
num4 -= num2;
if (num4 < 0f)
{
break;
}
num++;
if (num + 4 > num5)
{
num5 += 10;
num3 = 5f + 5f * (float)(num / 10);
}
num2 = 15f + num3 * (float)num;
}
return num;
}
private int GetMaxSecondaryStock()
{
if (cachedEffectiveAuthority)
{
return lunarSpikeSkill.GetBaseMaxStock();
}
return maxSecondaryStock;
}
private int GetSecondaryStock()
{
if (cachedEffectiveAuthority)
{
return lunarSpikeSkill.GetBaseStock();
}
return secondaryStock;
}
private void UpdateStats()
{
characterBody.RecalculateStats();
}
private void CalcTamperedHeartStats()
{
int num = maxSecondaryStock - secondaryStock;
if (num < 0)
{
num = 0;
}
float heartRegen = tamperedHeartRegen * (float)num;
float heartMSpeed = tamperedHeartMoveSpeed * (float)num;
float attackSpeed = tamperedHeartAttackSpeed * (float)secondaryStock;
float armor = tamperedHeartArmor * (float)secondaryStock;
float heartDamage = 0f;
characterBody.ApplyTamperedHeartPassive(heartRegen, heartMSpeed, heartDamage, armor, attackSpeed);
UpdateStats();
oldSecondaryStock = secondaryStock;
}
private float CalculateHyperbolicStatBonuses(float statCalc, float spikesToCalculate)
{
float num = 0f;
if (spikesToCalculate > 0f)
{
if (spikesToCalculate <= 4f)
{
num += spikesToCalculate * statCalc;
}
else if (spikesToCalculate > 4f)
{
num += statCalc * 4f + (1f - 1f / (statCalc * (spikesToCalculate - 4f) + 1f));
}
}
return num;
}
private float RegenAndMoveSpeedCalc(float statCalc)
{
if (secondaryStock < maxSecondaryStock)
{
return statCalc * (float)(maxSecondaryStock - secondaryStock);
}
return 0f;
}
private void IncreaseStockCount()
{
extraShardFromHealth = GetTotalSpikeCount();
if (extraShardFromHealth != oldExtraShardFromHealth)
{
if (extraShardFromHealth < 0)
{
extraShardFromHealth = 0;
}
characterBody.extraSecondaryFromSkill = extraShardFromHealth;
int num = extraShardFromHealth / 4;
if (laserSpecialSkill.skillDef.skillIndex == laserBurstSkillIndex && num > 0)
{
characterBody.extraSpecialFromSkill = num;
}
UpdateStats();
oldExtraShardFromHealth = extraShardFromHealth;
}
maxSecondaryStock = GetMaxSecondaryStock();
}
public float GetClubSwingAltSecondaryTimestamp()
{
return clubSwingAltSecondaryTimestamp;
}
public void SetClubSwingAltSecondaryTimestamp()
{
clubSwingAltSecondaryTimestamp = Time.time;
}
private void CacheEffectiveAuthority()
{
cachedEffectiveAuthority = Util.HasEffectiveAuthority(networkIdentity);
}
private void UNetVersion()
{
}
protected static void InvokeCmdCmdUpdateAmmoAmounts(NetworkBehaviour obj, NetworkReader reader)
{
if (!NetworkServer.active)
{
Debug.LogError("Command CmdUpdateAmmoAmounts called on client.");
}
else
{
((FalseSonController)obj).CmdUpdateAmmoAmounts((int)reader.ReadPackedUInt32(), (int)reader.ReadPackedUInt32());
}
}
public void CallCmdUpdateAmmoAmounts(int _secondaryStock, int _maxSecondaryStock)
{
if (!NetworkClient.active)
{
Debug.LogError("Command function CmdUpdateAmmoAmounts called on server.");
return;
}
if (base.isServer)
{
CmdUpdateAmmoAmounts(_secondaryStock, _maxSecondaryStock);
return;
}
NetworkWriter networkWriter = new NetworkWriter();
networkWriter.Write((short)0);
networkWriter.Write((short)5);
networkWriter.WritePackedUInt32((uint)kCmdCmdUpdateAmmoAmounts);
networkWriter.Write(GetComponent<NetworkIdentity>().netId);
networkWriter.WritePackedUInt32((uint)_secondaryStock);
networkWriter.WritePackedUInt32((uint)_maxSecondaryStock);
SendCommandInternal(networkWriter, 0, "CmdUpdateAmmoAmounts");
}
static FalseSonController()
{
kCmdCmdUpdateAmmoAmounts = -634793383;
NetworkBehaviour.RegisterCommandDelegate(typeof(FalseSonController), kCmdCmdUpdateAmmoAmounts, InvokeCmdCmdUpdateAmmoAmounts);
NetworkCRC.RegisterBehaviour("FalseSonController", 0);
}
public override bool OnSerialize(NetworkWriter writer, bool forceAll)
{
bool result = default(bool);
return result;
}
public override void OnDeserialize(NetworkReader reader, bool initialState)
{
}
public override void PreStartClient()
{
}
}