80 lines
1.8 KiB
C#
80 lines
1.8 KiB
C#
|
using RoR2;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Networking;
|
||
|
|
||
|
namespace EntityStates.ScavMonster;
|
||
|
|
||
|
public class Death : GenericCharacterDeath
|
||
|
{
|
||
|
[SerializeField]
|
||
|
public SpawnCard spawnCard;
|
||
|
|
||
|
public static float duration;
|
||
|
|
||
|
private bool shouldDropPack;
|
||
|
|
||
|
protected override bool shouldAutoDestroy => false;
|
||
|
|
||
|
public override void OnEnter()
|
||
|
{
|
||
|
base.OnEnter();
|
||
|
if (!NetworkServer.active)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
CharacterMaster characterMaster = (base.characterBody ? base.characterBody.master : null);
|
||
|
if ((bool)characterMaster)
|
||
|
{
|
||
|
bool flag = characterMaster.IsExtraLifePendingServer();
|
||
|
bool flag2 = characterMaster.inventory.GetItemCount(RoR2Content.Items.Ghost) > 0;
|
||
|
bool flag3 = !Stage.instance || Stage.instance.scavPackDroppedServer;
|
||
|
shouldDropPack = !flag && !flag2 && !flag3;
|
||
|
if (shouldDropPack)
|
||
|
{
|
||
|
Stage.instance.scavPackDroppedServer = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void FixedUpdate()
|
||
|
{
|
||
|
base.FixedUpdate();
|
||
|
if (NetworkServer.active && base.fixedAge >= duration)
|
||
|
{
|
||
|
DestroyBodyAsapServer();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void OnExit()
|
||
|
{
|
||
|
DestroyModel();
|
||
|
base.OnExit();
|
||
|
}
|
||
|
|
||
|
protected override void OnPreDestroyBodyServer()
|
||
|
{
|
||
|
base.OnPreDestroyBodyServer();
|
||
|
if (shouldDropPack)
|
||
|
{
|
||
|
AttemptDropPack();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void AttemptDropPack()
|
||
|
{
|
||
|
DirectorCore instance = DirectorCore.instance;
|
||
|
if ((bool)instance)
|
||
|
{
|
||
|
Xoroshiro128Plus rng = new Xoroshiro128Plus(Run.instance.stageRng.nextUint);
|
||
|
DirectorPlacementRule placementRule = new DirectorPlacementRule
|
||
|
{
|
||
|
placementMode = DirectorPlacementRule.PlacementMode.NearestNode,
|
||
|
position = base.characterBody.footPosition,
|
||
|
minDistance = 0f,
|
||
|
maxDistance = float.PositiveInfinity
|
||
|
};
|
||
|
_ = (bool)instance.TrySpawnObject(new DirectorSpawnRequest(spawnCard, placementRule, rng));
|
||
|
}
|
||
|
}
|
||
|
}
|