r2mods/ilspy_dump/ror2_csproj/RoR2/GlobalDeathRewards.cs

79 lines
1.7 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Networking;
namespace RoR2;
public class GlobalDeathRewards : MonoBehaviour
{
[Serializable]
public struct PickupReward
{
[SerializeField]
public PickupDropTable dropTable;
[EnumMask(typeof(CharacterBody.BodyFlags))]
[SerializeField]
public CharacterBody.BodyFlags requiredBodyFlags;
[SerializeField]
[Range(0f, 1f)]
public float chance;
[SerializeField]
public Vector3 velocity;
}
[SerializeField]
private bool requirePlayerAttacker;
[SerializeField]
private PickupReward[] pickupRewards;
private Xoroshiro128Plus rng;
private void Start()
{
if (NetworkServer.active)
{
rng = new Xoroshiro128Plus(Run.instance.runRNG.nextUlong);
}
}
private void OnEnable()
{
GlobalEventManager.onCharacterDeathGlobal += OnCharacterDeathGlobal;
}
private void OnDisable()
{
GlobalEventManager.onCharacterDeathGlobal -= OnCharacterDeathGlobal;
}
private void OnCharacterDeathGlobal(DamageReport damageReport)
{
if (!NetworkServer.active)
{
return;
}
bool flag = true;
if (requirePlayerAttacker)
{
flag = (bool)damageReport.attackerMaster && (bool)damageReport.attackerMaster.GetComponent<PlayerCharacterMasterController>();
}
if (!flag)
{
return;
}
PickupReward[] array = pickupRewards;
for (int i = 0; i < array.Length; i++)
{
PickupReward pickupReward = array[i];
if ((damageReport.victimBody.bodyFlags & pickupReward.requiredBodyFlags) == pickupReward.requiredBodyFlags && (bool)pickupReward.dropTable && rng.nextNormalizedFloat <= pickupReward.chance)
{
PickupDropletController.CreatePickupDroplet(pickupReward.dropTable.GenerateDrop(rng), damageReport.victim.transform.position, pickupReward.velocity);
}
}
}
}