239 lines
4.0 KiB
C#
239 lines
4.0 KiB
C#
using System.Runtime.InteropServices;
|
|
using Unity;
|
|
using UnityEngine;
|
|
using UnityEngine.Networking;
|
|
|
|
namespace RoR2;
|
|
|
|
public class GenericEnergyComponent : NetworkBehaviour
|
|
{
|
|
[SerializeField]
|
|
private float _capacity = 1f;
|
|
|
|
[SerializeField]
|
|
private float _chargeRate = 1f;
|
|
|
|
[SyncVar]
|
|
private Run.FixedTimeStamp referenceTime;
|
|
|
|
private float _internalChargeRate;
|
|
|
|
public bool hasEffectiveAuthority { get; private set; }
|
|
|
|
public float energy
|
|
{
|
|
get
|
|
{
|
|
if (internalChargeRate == 0f)
|
|
{
|
|
return (referenceTime - Run.FixedTimeStamp.zero) * capacity;
|
|
}
|
|
return Mathf.Clamp01(referenceTime.timeSince * internalChargeRate) * capacity;
|
|
}
|
|
set
|
|
{
|
|
float num = (capacity.Equals(0f) ? 0f : Mathf.Clamp01(value / capacity));
|
|
if (internalChargeRate == 0f)
|
|
{
|
|
NetworkreferenceTime = Run.FixedTimeStamp.zero + num;
|
|
}
|
|
else
|
|
{
|
|
NetworkreferenceTime = Run.FixedTimeStamp.now - num / internalChargeRate;
|
|
}
|
|
}
|
|
}
|
|
|
|
public float normalizedEnergy
|
|
{
|
|
get
|
|
{
|
|
if (capacity == 0f)
|
|
{
|
|
return 0f;
|
|
}
|
|
return Mathf.Clamp01(energy / capacity);
|
|
}
|
|
}
|
|
|
|
private float internalChargeRate
|
|
{
|
|
get
|
|
{
|
|
return _internalChargeRate;
|
|
}
|
|
set
|
|
{
|
|
if (_internalChargeRate != value)
|
|
{
|
|
float num = energy;
|
|
_internalChargeRate = value;
|
|
energy = num;
|
|
}
|
|
}
|
|
}
|
|
|
|
public float chargeRate
|
|
{
|
|
get
|
|
{
|
|
return _chargeRate;
|
|
}
|
|
set
|
|
{
|
|
if (_chargeRate != value)
|
|
{
|
|
float num = energy;
|
|
_chargeRate = value;
|
|
internalChargeRate = ((capacity != 0f) ? (_chargeRate / capacity) : 0f);
|
|
energy = num;
|
|
}
|
|
}
|
|
}
|
|
|
|
public float normalizedChargeRate
|
|
{
|
|
get
|
|
{
|
|
if (capacity == 0f)
|
|
{
|
|
return 0f;
|
|
}
|
|
return chargeRate / capacity;
|
|
}
|
|
set
|
|
{
|
|
chargeRate = ((capacity != 0f) ? (value * capacity) : 0f);
|
|
}
|
|
}
|
|
|
|
public float capacity
|
|
{
|
|
get
|
|
{
|
|
return _capacity;
|
|
}
|
|
set
|
|
{
|
|
if (value != _capacity)
|
|
{
|
|
float num = energy;
|
|
_capacity = value;
|
|
energy = num;
|
|
}
|
|
}
|
|
}
|
|
|
|
public Run.FixedTimeStamp NetworkreferenceTime
|
|
{
|
|
get
|
|
{
|
|
return referenceTime;
|
|
}
|
|
[param: In]
|
|
set
|
|
{
|
|
SetSyncVar(value, ref referenceTime, 1u);
|
|
}
|
|
}
|
|
|
|
private void UpdateAuthority()
|
|
{
|
|
hasEffectiveAuthority = Util.HasEffectiveAuthority(base.gameObject);
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
UpdateAuthority();
|
|
internalChargeRate = ((capacity != 0f) ? (chargeRate / capacity) : 0f);
|
|
if (NetworkServer.active)
|
|
{
|
|
energy = capacity;
|
|
}
|
|
}
|
|
|
|
public override void OnStartAuthority()
|
|
{
|
|
base.OnStartAuthority();
|
|
UpdateAuthority();
|
|
}
|
|
|
|
public override void OnStopAuthority()
|
|
{
|
|
base.OnStopAuthority();
|
|
UpdateAuthority();
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
internalChargeRate = ((capacity != 0f) ? (chargeRate / capacity) : 0f);
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
internalChargeRate = 0f;
|
|
}
|
|
|
|
[Server]
|
|
public bool TakeEnergy(float amount)
|
|
{
|
|
if (!NetworkServer.active)
|
|
{
|
|
Debug.LogWarning("[Server] function 'System.Boolean RoR2.GenericEnergyComponent::TakeEnergy(System.Single)' called on client");
|
|
return false;
|
|
}
|
|
if (amount > energy)
|
|
{
|
|
return false;
|
|
}
|
|
energy -= amount;
|
|
return true;
|
|
}
|
|
|
|
private void UNetVersion()
|
|
{
|
|
}
|
|
|
|
public override bool OnSerialize(NetworkWriter writer, bool forceAll)
|
|
{
|
|
if (forceAll)
|
|
{
|
|
GeneratedNetworkCode._WriteFixedTimeStamp_Run(writer, referenceTime);
|
|
return true;
|
|
}
|
|
bool flag = false;
|
|
if ((base.syncVarDirtyBits & (true ? 1u : 0u)) != 0)
|
|
{
|
|
if (!flag)
|
|
{
|
|
writer.WritePackedUInt32(base.syncVarDirtyBits);
|
|
flag = true;
|
|
}
|
|
GeneratedNetworkCode._WriteFixedTimeStamp_Run(writer, referenceTime);
|
|
}
|
|
if (!flag)
|
|
{
|
|
writer.WritePackedUInt32(base.syncVarDirtyBits);
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
public override void OnDeserialize(NetworkReader reader, bool initialState)
|
|
{
|
|
if (initialState)
|
|
{
|
|
referenceTime = GeneratedNetworkCode._ReadFixedTimeStamp_Run(reader);
|
|
return;
|
|
}
|
|
int num = (int)reader.ReadPackedUInt32();
|
|
if (((uint)num & (true ? 1u : 0u)) != 0)
|
|
{
|
|
referenceTime = GeneratedNetworkCode._ReadFixedTimeStamp_Run(reader);
|
|
}
|
|
}
|
|
|
|
public override void PreStartClient()
|
|
{
|
|
}
|
|
}
|