143 lines
3.0 KiB
C#
143 lines
3.0 KiB
C#
|
using System;
|
||
|
using EntityStates;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Networking;
|
||
|
|
||
|
namespace RoR2;
|
||
|
|
||
|
public class GauntletMissionController : NetworkBehaviour
|
||
|
{
|
||
|
public class GauntletMissionBaseState : EntityState
|
||
|
{
|
||
|
protected GauntletMissionController gauntletMissionController => instance;
|
||
|
}
|
||
|
|
||
|
public class MissionCompleted : GauntletMissionBaseState
|
||
|
{
|
||
|
public override void OnEnter()
|
||
|
{
|
||
|
base.OnEnter();
|
||
|
base.gauntletMissionController.clearedEffect.SetActive(value: true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[Header("Behavior Values")]
|
||
|
public float dleayBeforeStart;
|
||
|
|
||
|
public float timeLimit;
|
||
|
|
||
|
public float degenTickFrequency;
|
||
|
|
||
|
public float percentDegenPerSecond;
|
||
|
|
||
|
[Header("Cached Components")]
|
||
|
private EntityStateMachine mainStateMachine;
|
||
|
|
||
|
public GameObject[] gauntletShards;
|
||
|
|
||
|
public GameObject clearedEffect;
|
||
|
|
||
|
public GameObject gauntletPortal;
|
||
|
|
||
|
private bool gauntletEnd;
|
||
|
|
||
|
private bool slowDeathEffectActive;
|
||
|
|
||
|
private float degenTimer;
|
||
|
|
||
|
public static GauntletMissionController instance { get; private set; }
|
||
|
|
||
|
public static event Action onInstanceChangedGlobal;
|
||
|
|
||
|
private void Awake()
|
||
|
{
|
||
|
mainStateMachine = EntityStateMachine.FindByCustomName(base.gameObject, "Main");
|
||
|
}
|
||
|
|
||
|
private void OnEnable()
|
||
|
{
|
||
|
instance = SingletonHelper.Assign(instance, this);
|
||
|
GauntletMissionController.onInstanceChangedGlobal?.Invoke();
|
||
|
}
|
||
|
|
||
|
private void OnDisable()
|
||
|
{
|
||
|
instance = SingletonHelper.Unassign(instance, this);
|
||
|
GauntletMissionController.onInstanceChangedGlobal?.Invoke();
|
||
|
}
|
||
|
|
||
|
public void GauntletMissionTimesUp()
|
||
|
{
|
||
|
gauntletEnd = true;
|
||
|
mainStateMachine.SetNextState(new MissionCompleted());
|
||
|
}
|
||
|
|
||
|
private void OnPreGeneratePlayerSpawnPointsServer(SceneDirector sceneDirector, ref Action generationMethod)
|
||
|
{
|
||
|
generationMethod = GenerateGauntletShards;
|
||
|
}
|
||
|
|
||
|
private void GenerateGauntletShards()
|
||
|
{
|
||
|
_ = gauntletShards.LongLength;
|
||
|
}
|
||
|
|
||
|
private void FixedUpdate()
|
||
|
{
|
||
|
if (NetworkServer.active)
|
||
|
{
|
||
|
FixedUpdateServer();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[Server]
|
||
|
private void FixedUpdateServer()
|
||
|
{
|
||
|
if (!NetworkServer.active)
|
||
|
{
|
||
|
Debug.LogWarning("[Server] function 'System.Void RoR2.GauntletMissionController::FixedUpdateServer()' called on client");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (!gauntletEnd)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
degenTimer += Time.fixedDeltaTime;
|
||
|
if (!(degenTimer > 1f / degenTickFrequency))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
degenTimer -= 1f / degenTickFrequency;
|
||
|
foreach (TeamComponent teamMember in TeamComponent.GetTeamMembers(TeamIndex.Player))
|
||
|
{
|
||
|
float damage = percentDegenPerSecond / 100f / degenTickFrequency * teamMember.body.healthComponent.combinedHealth;
|
||
|
teamMember.body.healthComponent.TakeDamage(new DamageInfo
|
||
|
{
|
||
|
damage = damage,
|
||
|
position = teamMember.body.corePosition,
|
||
|
damageType = DamageType.Silent
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void UNetVersion()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
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()
|
||
|
{
|
||
|
}
|
||
|
}
|